From 866dc81dd8f407995c7d36bb40e2476a85850cfd Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Wed, 12 Aug 2020 14:25:41 +0200
Subject: [PATCH] FEAT #14537 TIME 2:45 range tu + some fixes

---
 phpunit.xml                                   |   1 +
 sql/structure.sql                             |  13 +
 .../RegisteredNumberRangeController.php       |  15 +-
 .../models/RegisteredNumberRangeModel.php     |   9 +-
 .../IssuingSiteControllerTest.php             |  28 +-
 .../RegisteredNumberRangeControllerTest.php   | 426 ++++++++++++++++++
 6 files changed, 469 insertions(+), 23 deletions(-)
 create mode 100644 test/unitTests/app/registeredMail/RegisteredNumberRangeControllerTest.php

diff --git a/phpunit.xml b/phpunit.xml
index 3dcac176837..5565820a6c4 100755
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -49,6 +49,7 @@
             <file>test/unitTests/app/acknowledgementReceipt/AcknowledgementReceiptControllerTest.php</file>
             <file>test/unitTests/app/notification/DiffusionTypesControllerTest.php</file>
             <file>test/unitTests/app/registeredMail/IssuingSiteControllerTest.php</file>
+            <file>test/unitTests/app/registeredMail/RegisteredNumberRangeControllerTest.php</file>
             <!-- The last one should be history -->
             <file>test/unitTests/app/history/HistoryControllerTest.php</file>
         </testsuite>
diff --git a/sql/structure.sql b/sql/structure.sql
index 3a727e5ab04..67f53d3234f 100755
--- a/sql/structure.sql
+++ b/sql/structure.sql
@@ -1430,3 +1430,16 @@ CREATE TABLE IF NOT EXISTS issuing_sites_entities
     CONSTRAINT issuing_sites_entities_pkey PRIMARY KEY (id),
     CONSTRAINT issuing_sites_entities_unique_key UNIQUE (site_id, entity_id)
 );
+CREATE TABLE IF NOT EXISTS registered_number_range (
+   id SERIAL NOT NULL,
+   type CHARACTER VARYING(15) NOT NULL,
+   tracking_account_number CHARACTER VARYING(256),
+   range_start INTEGER,
+   range_end INTEGER,
+   creator INTEGER,
+   created timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
+   site_id INTEGER,
+   status CHARACTER VARYING(10),
+   current_number INTEGER DEFAULT 0 NOT NULL,
+   CONSTRAINT registered_number_range_pkey PRIMARY KEY (id)
+);
diff --git a/src/app/registeredMail/controllers/RegisteredNumberRangeController.php b/src/app/registeredMail/controllers/RegisteredNumberRangeController.php
index 222e60d5746..1fb22d17904 100644
--- a/src/app/registeredMail/controllers/RegisteredNumberRangeController.php
+++ b/src/app/registeredMail/controllers/RegisteredNumberRangeController.php
@@ -32,9 +32,11 @@ class RegisteredNumberRangeController
         $ranges = RegisteredNumberRangeModel::get();
 
         foreach ($ranges as $key => $range) {
-            $fullness = $range['currentNumber'] - $range['range_start'];
+            $fullness = $range['current_number'] - $range['range_start'];
             $rangeSize = $range['range_end'] - $range['range_start'];
             $fullness = ($fullness / $rangeSize) * 100;
+            $fullness = $fullness < 0 ? 0 : $fullness;
+            $fullness = round($fullness, 2);
 
             $site = IssuingSiteModel::getById(['id' => $range['site_id']]);
             $ranges[$key] = [
@@ -48,7 +50,7 @@ class RegisteredNumberRangeController
                 'siteId'                => $range['site_id'],
                 'status'                => $range['status'],
                 'customerAccountNumber' => $site['account_number'],
-                'currentNumber'         => $range['currentNumber'],
+                'currentNumber'         => $range['current_number'],
                 'fullness'              => $fullness
             ];
         }
@@ -70,9 +72,11 @@ class RegisteredNumberRangeController
 
         $site = IssuingSiteModel::getById(['id' => $range['site_id']]);
 
-        $fullness = $range['currentNumber'] - $range['range_start'];
+        $fullness = $range['current_number'] - $range['range_start'];
         $rangeSize = $range['range_end'] - $range['range_start'];
         $fullness = ($fullness / $rangeSize) * 100;
+        $fullness = $fullness < 0 ? 0 : $fullness;
+        $fullness = round($fullness, 2);
 
         $range = [
             'id'                    => $range['id'],
@@ -85,7 +89,7 @@ class RegisteredNumberRangeController
             'siteId'                => $range['site_id'],
             'status'                => $range['status'],
             'customerAccountNumber' => $site['account_number'],
-            'currentNumber'         => $range['currentNumber'],
+            'currentNumber'         => $range['current_number'],
             'fullness'              => $fullness
         ];
 
@@ -128,7 +132,8 @@ class RegisteredNumberRangeController
             'rangeEnd'              => $body['rangeEnd'],
             'creator'               => $GLOBALS['id'],
             'siteId'                => $body['siteId'],
-            'status'                => $body['status']
+            'status'                => $body['status'],
+            'currentNumber'         => $body['rangeStart']
         ]);
 
         HistoryController::add([
diff --git a/src/app/registeredMail/models/RegisteredNumberRangeModel.php b/src/app/registeredMail/models/RegisteredNumberRangeModel.php
index 11626e977e9..771cba84639 100644
--- a/src/app/registeredMail/models/RegisteredNumberRangeModel.php
+++ b/src/app/registeredMail/models/RegisteredNumberRangeModel.php
@@ -50,9 +50,9 @@ class RegisteredNumberRangeModel
 
     public static function create(array $args)
     {
-        ValidatorModel::notEmpty($args, ['type', 'rangeStart', 'rangeEnd', 'siteId']);
+        ValidatorModel::notEmpty($args, ['type', 'rangeStart', 'rangeEnd', 'siteId', 'currentNumber']);
         ValidatorModel::stringType($args, ['type']);
-        ValidatorModel::intVal($args, ['rangeStart', 'rangeEnd', 'siteId']);
+        ValidatorModel::intVal($args, ['rangeStart', 'rangeEnd', 'siteId', 'currentNumber']);
 
         $nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'registered_number_range_id_seq']);
 
@@ -64,8 +64,9 @@ class RegisteredNumberRangeModel
                 'tracking_account_number' => $args['trackingAccountNumber'],
                 'range_start'             => $args['rangeStart'],
                 'range_end'               => $args['rangeEnd'],
-                'creator'                 => $args['id'],
-                'site_id'                 => $args['siteId']
+                'creator'                 => $args['creator'],
+                'site_id'                 => $args['siteId'],
+                'current_number'          => $args['currentNumber']
             ]
         ]);
 
diff --git a/test/unitTests/app/registeredMail/IssuingSiteControllerTest.php b/test/unitTests/app/registeredMail/IssuingSiteControllerTest.php
index 847a8c8c0a0..8858885c9ca 100644
--- a/test/unitTests/app/registeredMail/IssuingSiteControllerTest.php
+++ b/test/unitTests/app/registeredMail/IssuingSiteControllerTest.php
@@ -26,7 +26,7 @@ class IssuingSiteControllerTest extends TestCase
             'postOfficeLabel'    => 'Scranton Post Office',
             'accountNumber'      => 42,
             'addressStreet'      => '1725',
-            'ddressAdditional1'  => null,
+            'addressAdditional1' => null,
             'addressAdditional2' => null,
             'addressPostcode'    => '18505',
             'addressTown'        => 'Scranton',
@@ -55,8 +55,8 @@ class IssuingSiteControllerTest extends TestCase
         $this->assertSame('Scranton Post Office', $responseBody['site']['postOfficeLabel']);
         $this->assertSame('42', $responseBody['site']['accountNumber']);
         $this->assertSame('1725', $responseBody['site']['addressStreet']);
-        $this->assertEmpty($responseBody['site']['ddressAdditional1']);
-        $this->assertEmpty($responseBody['site']['ddressAdditional2']);
+        $this->assertEmpty($responseBody['site']['addressAdditional1']);
+        $this->assertEmpty($responseBody['site']['addressAdditional2']);
         $this->assertSame('18505', $responseBody['site']['addressPostcode']);
         $this->assertSame('Scranton', $responseBody['site']['addressTown']);
         $this->assertSame('USA', $responseBody['site']['addressCountry']);
@@ -82,7 +82,7 @@ class IssuingSiteControllerTest extends TestCase
             'postOfficeLabel'    => 'Scranton Post Office',
             'accountNumber'      => 42,
             'addressStreet'      => '1725',
-            'ddressAdditional1'  => null,
+            'addressAdditional1' => null,
             'addressAdditional2' => null,
             'addressPostcode'    => '18505',
             'addressTown'        => 'Scranton',
@@ -101,7 +101,7 @@ class IssuingSiteControllerTest extends TestCase
             'postOfficeLabel'    => 'Scranton Post Office',
             'accountNumber'      => 42,
             'addressStreet'      => '1725',
-            'ddressAdditional1'  => null,
+            'addressAdditional1' => null,
             'addressAdditional2' => null,
             'addressPostcode'    => '18505',
             'addressTown'        => 'Scranton',
@@ -155,8 +155,8 @@ class IssuingSiteControllerTest extends TestCase
         $this->assertSame('Scranton Post Office', $responseBody['sites'][0]['postOfficeLabel']);
         $this->assertSame('42', $responseBody['sites'][0]['accountNumber']);
         $this->assertSame('1725', $responseBody['sites'][0]['addressStreet']);
-        $this->assertEmpty($responseBody['sites'][0]['ddressAdditional1']);
-        $this->assertEmpty($responseBody['sites'][0]['ddressAdditional2']);
+        $this->assertEmpty($responseBody['sites'][0]['addressAdditional1']);
+        $this->assertEmpty($responseBody['sites'][0]['addressAdditional2']);
         $this->assertSame('18505', $responseBody['sites'][0]['addressPostcode']);
         $this->assertSame('Scranton', $responseBody['sites'][0]['addressTown']);
         $this->assertSame('USA', $responseBody['sites'][0]['addressCountry']);
@@ -193,8 +193,8 @@ class IssuingSiteControllerTest extends TestCase
         $this->assertSame('Scranton Post Office', $responseBody['site']['postOfficeLabel']);
         $this->assertSame('42', $responseBody['site']['accountNumber']);
         $this->assertSame('1725', $responseBody['site']['addressStreet']);
-        $this->assertEmpty($responseBody['site']['ddressAdditional1']);
-        $this->assertEmpty($responseBody['site']['ddressAdditional2']);
+        $this->assertEmpty($responseBody['site']['addressAdditional1']);
+        $this->assertEmpty($responseBody['site']['addressAdditional2']);
         $this->assertSame('18505', $responseBody['site']['addressPostcode']);
         $this->assertSame('Scranton', $responseBody['site']['addressTown']);
         $this->assertSame('USA', $responseBody['site']['addressCountry']);
@@ -230,7 +230,7 @@ class IssuingSiteControllerTest extends TestCase
             'accountNumber'      => 42,
             'addressName'        => 'Dunder Mifflin Scranton',
             'addressStreet'      => '1725',
-            'ddressAdditional1'  => null,
+            'addressAdditional1' => null,
             'addressAdditional2' => null,
             'addressPostcode'    => '18505',
             'addressTown'        => 'Scranton',
@@ -254,8 +254,8 @@ class IssuingSiteControllerTest extends TestCase
         $this->assertSame('Scranton Post Office', $responseBody['site']['postOfficeLabel']);
         $this->assertSame('42', $responseBody['site']['accountNumber']);
         $this->assertSame('1725', $responseBody['site']['addressStreet']);
-        $this->assertEmpty($responseBody['site']['ddressAdditional1']);
-        $this->assertEmpty($responseBody['site']['ddressAdditional2']);
+        $this->assertEmpty($responseBody['site']['addressAdditional1']);
+        $this->assertEmpty($responseBody['site']['addressAdditional2']);
         $this->assertSame('18505', $responseBody['site']['addressPostcode']);
         $this->assertSame('Scranton', $responseBody['site']['addressTown']);
         $this->assertSame('USA', $responseBody['site']['addressCountry']);
@@ -282,7 +282,7 @@ class IssuingSiteControllerTest extends TestCase
             'postOfficeLabel'    => 'Scranton Post Office',
             'accountNumber'      => 42,
             'addressStreet'      => '1725',
-            'ddressAdditional1'  => null,
+            'addressAdditional1' => null,
             'addressAdditional2' => null,
             'addressPostcode'    => '18505',
             'addressTown'        => 'Scranton',
@@ -301,7 +301,7 @@ class IssuingSiteControllerTest extends TestCase
             'postOfficeLabel'    => 'Scranton Post Office',
             'accountNumber'      => 42,
             'addressStreet'      => '1725',
-            'ddressAdditional1'  => null,
+            'addressAdditional1' => null,
             'addressAdditional2' => null,
             'addressPostcode'    => '18505',
             'addressTown'        => 'Scranton',
diff --git a/test/unitTests/app/registeredMail/RegisteredNumberRangeControllerTest.php b/test/unitTests/app/registeredMail/RegisteredNumberRangeControllerTest.php
new file mode 100644
index 00000000000..1d2972bb539
--- /dev/null
+++ b/test/unitTests/app/registeredMail/RegisteredNumberRangeControllerTest.php
@@ -0,0 +1,426 @@
+<?php
+
+/**
+ * Copyright Maarch since 2008 under licence GPLv3.
+ * See LICENCE.txt file at the root folder for more details.
+ * This file is part of Maarch software.
+ *
+ */
+
+use PHPUnit\Framework\TestCase;
+
+class RegisteredNumberRangeControllerTest extends TestCase
+{
+    private static $id = null;
+    private static $siteId = null;
+
+    public function testCreate()
+    {
+        $registeredNumberRangeController = new \RegisteredMail\controllers\RegisteredNumberRangeController();
+        $issuingSiteController = new \RegisteredMail\controllers\IssuingSiteController();
+
+        //  CREATE
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $body = [
+            'siteLabel'          => 'Scranton',
+            'postOfficeLabel'    => 'Scranton Post Office',
+            'accountNumber'      => 42,
+            'addressStreet'      => '1725',
+            'addressAdditional1' => null,
+            'addressAdditional2' => null,
+            'addressPostcode'    => '18505',
+            'addressTown'        => 'Scranton',
+            'addressCountry'     => 'USA',
+            'entities'           => [6]
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $issuingSiteController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(200, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertIsInt($responseBody['id']);
+
+        self::$siteId = $responseBody['id'];
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+            'rangeStart'         => 1,
+            'rangeEnd'           => 1000,
+            'siteId'             => self::$siteId
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(200, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertIsInt($responseBody['id']);
+
+        self::$id = $responseBody['id'];
+
+        //  READ
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+        $response = $registeredNumberRangeController->getById($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(200, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+
+        $this->assertNotEmpty($responseBody['range']);
+        $this->assertSame(self::$id, $responseBody['range']['id']);
+        $this->assertSame('B01', $responseBody['range']['registeredMailType']);
+        $this->assertSame('AZPOKF30KDZP', $responseBody['range']['trackerNumber']);
+        $this->assertSame(1, $responseBody['range']['rangeStart']);
+        $this->assertSame(1000, $responseBody['range']['rangeEnd']);
+        $this->assertSame(self::$siteId, $responseBody['range']['siteId']);
+        $this->assertSame($GLOBALS['id'], $responseBody['range']['creator']);
+        $this->assertSame(1, $responseBody['range']['currentNumber']);
+        $this->assertSame(0, $responseBody['range']['fullness']);
+
+        // fail
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $body = [
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body registeredMailType is empty or not a string', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01'
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body trackerNumber is empty or not a string', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body rangeStart is empty or not an integer', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+            'rangeStart'         => 1,
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body rangeEnd is empty or not an integer', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+            'rangeStart'         => 1,
+            'rangeEnd'           => 1000,
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body siteId is empty or not an integer', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+            'rangeStart'         => 1,
+            'rangeEnd'           => 1000,
+            'siteId'             => self::$siteId * 1000
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body siteId does not exist', $responseBody['errors']);
+
+        $GLOBALS['login'] = 'bbain';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+
+        $response = $registeredNumberRangeController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(403, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+
+        $this->assertSame('Service forbidden', $responseBody['errors']);
+
+        $GLOBALS['login'] = 'superadmin';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+    }
+
+    public function testGet()
+    {
+        $registeredNumberRangeController = new \RegisteredMail\controllers\RegisteredNumberRangeController();
+
+        //  GET
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+        $response = $registeredNumberRangeController->get($request, new \Slim\Http\Response());
+        $this->assertSame(200, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+
+        $this->assertIsArray($responseBody['ranges']);
+        $this->assertNotEmpty($responseBody['ranges']);
+
+        $this->assertIsArray($responseBody['ranges'][0]);
+        $this->assertNotEmpty($responseBody['ranges'][0]);
+
+        $this->assertNotEmpty($responseBody['ranges'][0]);
+        $this->assertSame(self::$id, $responseBody['ranges'][0]['id']);
+        $this->assertSame('B01', $responseBody['ranges'][0]['registeredMailType']);
+        $this->assertSame('AZPOKF30KDZP', $responseBody['ranges'][0]['trackerNumber']);
+        $this->assertSame(1, $responseBody['ranges'][0]['rangeStart']);
+        $this->assertSame(1000, $responseBody['ranges'][0]['rangeEnd']);
+        $this->assertSame(self::$siteId, $responseBody['ranges'][0]['siteId']);
+        $this->assertSame($GLOBALS['id'], $responseBody['ranges'][0]['creator']);
+        $this->assertSame(1, $responseBody['ranges'][0]['currentNumber']);
+        $this->assertSame(0, $responseBody['ranges'][0]['fullness']);
+
+        $GLOBALS['login'] = 'bbain';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+
+        $response = $registeredNumberRangeController->get($request, new \Slim\Http\Response());
+        $this->assertSame(403, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Service forbidden', $responseBody['errors']);
+
+        $GLOBALS['login'] = 'superadmin';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+    }
+
+    public function testGetById()
+    {
+        $registeredNumberRangeController = new \RegisteredMail\controllers\RegisteredNumberRangeController();
+
+        //  GET
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+        $response = $registeredNumberRangeController->getById($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(200, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+
+        $this->assertNotEmpty($responseBody['range']);
+        $this->assertSame(self::$id, $responseBody['range']['id']);
+        $this->assertSame('B01', $responseBody['range']['registeredMailType']);
+        $this->assertSame('AZPOKF30KDZP', $responseBody['range']['trackerNumber']);
+        $this->assertSame(1, $responseBody['range']['rangeStart']);
+        $this->assertSame(1000, $responseBody['range']['rangeEnd']);
+        $this->assertSame(self::$siteId, $responseBody['range']['siteId']);
+        $this->assertSame($GLOBALS['id'], $responseBody['range']['creator']);
+        $this->assertSame(1, $responseBody['range']['currentNumber']);
+        $this->assertSame(0, $responseBody['range']['fullness']);
+
+        $GLOBALS['login'] = 'bbain';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+
+        $response = $registeredNumberRangeController->getById($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(403, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Service forbidden', $responseBody['errors']);
+
+        $GLOBALS['login'] = 'superadmin';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+    }
+
+    public function testUpdate()
+    {
+        $registeredNumberRangeController = new \RegisteredMail\controllers\RegisteredNumberRangeController();
+
+        //  UPDATE
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'PUT']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+            'rangeStart'         => 1,
+            'rangeEnd'           => 2000,
+            'siteId'             => self::$siteId
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(204, $response->getStatusCode());
+
+        //  READ
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+        $response = $registeredNumberRangeController->getById($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $responseBody = json_decode((string)$response->getBody(), true);
+
+        $this->assertNotEmpty($responseBody['range']);
+        $this->assertSame(self::$id, $responseBody['range']['id']);
+        $this->assertSame('B01', $responseBody['range']['registeredMailType']);
+        $this->assertSame('AZPOKF30KDZP', $responseBody['range']['trackerNumber']);
+        $this->assertSame(1, $responseBody['range']['rangeStart']);
+        $this->assertSame(2000, $responseBody['range']['rangeEnd']);
+        $this->assertSame(self::$siteId, $responseBody['range']['siteId']);
+        $this->assertSame($GLOBALS['id'], $responseBody['range']['creator']);
+        $this->assertSame(1, $responseBody['range']['currentNumber']);
+        $this->assertSame(0, $responseBody['range']['fullness']);
+
+        // fail
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'PUT']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $body = [
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body registeredMailType is empty or not a string', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01'
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body trackerNumber is empty or not a string', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body rangeStart is empty or not an integer', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+            'rangeStart'         => 1,
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body rangeEnd is empty or not an integer', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+            'rangeStart'         => 1,
+            'rangeEnd'           => 1000,
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body siteId is empty or not an integer', $responseBody['errors']);
+
+        $body = [
+            'registeredMailType' => 'B01',
+            'trackerNumber'      => 'AZPOKF30KDZP',
+            'rangeStart'         => 1,
+            'rangeEnd'           => 1000,
+            'siteId'             => self::$siteId * 1000
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body siteId does not exist', $responseBody['errors']);
+
+        $response = $registeredNumberRangeController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id * 1000]);
+        $this->assertSame(400, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Range not found', $responseBody['errors']);
+
+        $GLOBALS['login'] = 'bbain';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+
+        $body = [
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(403, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+
+        $this->assertSame('Service forbidden', $responseBody['errors']);
+
+        $GLOBALS['login'] = 'superadmin';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+    }
+
+    public function testDelete()
+    {
+        $registeredNumberRangeController = new \RegisteredMail\controllers\RegisteredNumberRangeController();
+        $issuingSiteController = new \RegisteredMail\controllers\IssuingSiteController();
+
+        //  DELETE
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'DELETE']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $response = $registeredNumberRangeController->delete($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(204, $response->getStatusCode());
+
+        $response = $registeredNumberRangeController->delete($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(204, $response->getStatusCode());
+
+        //  READ
+        $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request = \Slim\Http\Request::createFromEnvironment($environment);
+        $response = $registeredNumberRangeController->getById($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $responseBody = json_decode((string)$response->getBody(), true);
+
+        $this->assertSame('Range not found', $responseBody['errors']);
+
+        // Fail
+        $GLOBALS['login'] = 'bbain';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+
+        $body = [
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($body, $request);
+
+        $response = $registeredNumberRangeController->delete($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $this->assertSame(403, $response->getStatusCode());
+        $responseBody = json_decode((string)$response->getBody(), true);
+
+        $this->assertSame('Service forbidden', $responseBody['errors']);
+
+        $GLOBALS['login'] = 'superadmin';
+        $userInfo = \User\models\UserModel::getByLogin(['login' => $GLOBALS['login'], 'select' => ['id']]);
+        $GLOBALS['id'] = $userInfo['id'];
+
+        $response = $issuingSiteController->delete($request, new \Slim\Http\Response(), ['id' => self::$siteId]);
+        $this->assertSame(204, $response->getStatusCode());
+    }
+}
-- 
GitLab