diff --git a/CHANGELOG.md b/CHANGELOG.md index 69ba8f8..0342260 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # bonus-server-php-sdk change log +## 0.5.2 (27.08.2018) +- исправлена ошибка c часовыми поясами и добавлены проверки в тесты `Rarus\BonusServer\Util\DateTimeParser` [issue#58](https://github.com/rarus/bonus-server-php-sdk/issues/58) + ## 0.5.1 (20.08.2018) - исправлена ошибка с точностью в парсере timestamp `Rarus\BonusServer\Util\DateTimeParser` [issue#55](https://github.com/rarus/bonus-server-php-sdk/issues/55) - исправлена ошибка с некорректными датами рождения при добавлении новых пользователей [issue#55](https://github.com/rarus/bonus-server-php-sdk/issues/55) diff --git a/examples/user.add.php b/examples/user.add.php index 1594c78..d4e3266 100644 --- a/examples/user.add.php +++ b/examples/user.add.php @@ -2,21 +2,13 @@ declare(strict_types=1); require_once __DIR__ . '/init.php'; -$userArray = [ - 'name' => 'Михаил', - 'login' => 'grishi+1@rarus.ru', - 'phone' => '+7978 888 22 22', - 'email' => 'grishi@rarus.ru', - 'gender' => 'male', - 'birthdate' => '742262400', -]; - - $newUser = \Rarus\BonusServer\Users\DTO\Fabric::createNewInstance( 'grishi-' . random_int(0, PHP_INT_MAX), 'Михаил Гришин', '+7978 888 22 22', - 'grishi@rarus.ru' + 'grishi@rarus.ru', + null, + new \DateTime('06.06.1985') ); $transport = \Rarus\BonusServer\Users\Transport\Role\Organization\Fabric::getInstance($apiClient, new \Money\Currency('RUB'), $log); diff --git a/src/Rarus/BonusServer/Users/DTO/Fabric.php b/src/Rarus/BonusServer/Users/DTO/Fabric.php index 289ebfe..95c18fb 100644 --- a/src/Rarus/BonusServer/Users/DTO/Fabric.php +++ b/src/Rarus/BonusServer/Users/DTO/Fabric.php @@ -35,11 +35,7 @@ public static function initUserFromServerResponse(array $arUser, \DateTimeZone $ $user->setGender(Users\DTO\Gender\Fabric::initFromServerResponse($arUser['gender'])); } if ($arUser['birthdate'] !== 0) { - $gmtOffsetInSeconds = $dateTimeZone->getOffset(new \DateTime('now', $dateTimeZone)); - $realTimestamp = (int)$arUser['birthdate']; - $birthdateWithGmt = DateTimeParser::parseTimestampFromServerResponse((string)$realTimestamp, $dateTimeZone); - $birthday = \DateTime::createFromFormat('U', (string)($birthdateWithGmt->getTimestamp() + $gmtOffsetInSeconds), $dateTimeZone); - $birthday->setTimezone($dateTimeZone); + $birthday = DateTimeParser::parseTimestampFromServerResponse((string)$arUser['birthdate'], $dateTimeZone); $user->setBirthdate($birthday); } diff --git a/src/Rarus/BonusServer/Users/Formatters/User.php b/src/Rarus/BonusServer/Users/Formatters/User.php index 8b37288..9cd567a 100644 --- a/src/Rarus/BonusServer/Users/Formatters/User.php +++ b/src/Rarus/BonusServer/Users/Formatters/User.php @@ -71,9 +71,8 @@ public static function toArrayForCreateNewUser(BonusServer\Users\DTO\User $newUs 'gender' => $newUser->getGender() === null ? '' : $newUser->getGender()->getCode(), ]; if ($newUser->getBirthdate() !== null) { - $gmtOffsetInSeconds = $dateTimeZone->getOffset(new \DateTime('now', $dateTimeZone)); - $gmtTimestamp = (string)($newUser->getBirthdate()->getTimestamp() - $gmtOffsetInSeconds); - $arNewUser['birthdate'] = BonusServer\Util\DateTimeParser::convertToServerFormatTimestamp(\DateTime::createFromFormat('U', $gmtTimestamp, $dateTimeZone)); + $utcBirthday = new \DateTime($newUser->getBirthdate()->format('d.m.Y H:i:s'), new \DateTimeZone('UTC')); + $arNewUser['birthdate'] = BonusServer\Util\DateTimeParser::convertToServerFormatTimestamp($utcBirthday); } else { $arNewUser['birthdate'] = 0; } diff --git a/src/Rarus/BonusServer/Util/DateTimeParser.php b/src/Rarus/BonusServer/Util/DateTimeParser.php index a947dfc..02d955d 100644 --- a/src/Rarus/BonusServer/Util/DateTimeParser.php +++ b/src/Rarus/BonusServer/Util/DateTimeParser.php @@ -36,10 +36,12 @@ public static function parseTimestampFromServerResponse(string $timestampStr, \D )); } // отделяем миллисекунды - 3 последних цифры - $timestampStr = substr($timestampStr, 0, 9) . '.' . substr($timestampStr, 9); + $microseconds = substr($timestampStr, \strlen($timestampStr) - 3); + $timestampStr = substr($timestampStr, 0, -3) . '.' . $microseconds; + + $timestamp = \DateTime::createFromFormat('U.u', $timestampStr, new \DateTimeZone('UTC')); + $timestamp->setTimezone(new \DateTimeZone('UTC')); - $timestamp = \DateTime::createFromFormat('U.u', $timestampStr, $dateTimeZone); - $timestamp->setTimezone($dateTimeZone); if (false === $timestamp) { throw new ApiClientException(sprintf('ошибка при разборе поля время в ответе сервера [%s]', $timestampStr)); } diff --git a/tests/DemoDataGenerator.php b/tests/DemoDataGenerator.php index 99df54d..d1bf44d 100644 --- a/tests/DemoDataGenerator.php +++ b/tests/DemoDataGenerator.php @@ -39,9 +39,11 @@ public static function createNewCardCollection(int $cardsCount): Cards\DTO\CardC */ public static function createNewCard(): Cards\DTO\Card { + $cardPrefix = random_int(1000000, 100000000); + return Cards\DTO\Fabric::createNewInstance( - 'php-unit-test-card', - (string)random_int(1000000, 100000000), + 'php-unit-test-card' . $cardPrefix, + (string)$cardPrefix, \TestEnvironmentManager::getDefaultCurrency()); } @@ -49,6 +51,7 @@ public static function createNewCard(): Cards\DTO\Card * @param int $usersCount * * @return Users\DTO\UserCollection + * @throws Exception */ public static function createNewUserWithUserUidAndPasswordCollection(int $usersCount): Users\DTO\UserCollection { @@ -66,12 +69,15 @@ public static function createNewUserWithUserUidAndPasswordCollection(int $usersC * @param string $userPasswordHash * * @return Users\DTO\User + * @throws Exception */ public static function createNewUserWithUserUidAndPassword(string $userUid, string $userPasswordHash): \Rarus\BonusServer\Users\DTO\User { + $userUUID = random_int(0, PHP_INT_MAX); + return Users\DTO\Fabric::createNewInstance( $userUid, - 'Михаил Гришин', + 'Михаил Гришин | ' . $userUUID, '+79788882222', 'grishi@rarus.ru', null, @@ -88,13 +94,15 @@ public static function createNewUserWithUserUidAndPassword(string $userUid, stri */ public static function createNewUser(): \Rarus\BonusServer\Users\DTO\User { + $userUUID = random_int(0, PHP_INT_MAX); + return \Rarus\BonusServer\Users\DTO\Fabric::createNewInstance( - 'grishi-' . random_int(0, PHP_INT_MAX), - 'Михаил Гришин', + 'grishi-' . $userUUID, + 'Михаил Гришин | ' . $userUUID, '+7978 888 22 22', 'grishi@rarus.ru', Users\DTO\Gender\Fabric::getMale(), - new DateTime('06.08.1995 00:00:00', \TestEnvironmentManager::getDefaultTimezone()) + new DateTime('27.08.2018 00:00:00', \TestEnvironmentManager::getDefaultTimezone()) ); } @@ -104,9 +112,11 @@ public static function createNewUser(): \Rarus\BonusServer\Users\DTO\User */ public static function createNewUserWithSummerBirthday(): \Rarus\BonusServer\Users\DTO\User { + $userUUID = random_int(0, PHP_INT_MAX); + return \Rarus\BonusServer\Users\DTO\Fabric::createNewInstance( - 'grishi-' . random_int(0, PHP_INT_MAX), - 'Михаил Гришин', + 'grishi-' . $userUUID, + 'Михаил Гришин | ' . $userUUID, '+7978 888 22 22', 'grishi@rarus.ru', Users\DTO\Gender\Fabric::getMale(), @@ -114,15 +124,35 @@ public static function createNewUserWithSummerBirthday(): \Rarus\BonusServer\Use ); } + /** + * @return Users\DTO\User + * @throws Exception + */ + public static function createNewUserWithNowDateTimeBirthday(): \Rarus\BonusServer\Users\DTO\User + { + $userUUID = random_int(0, PHP_INT_MAX); + + return \Rarus\BonusServer\Users\DTO\Fabric::createNewInstance( + 'grishi-' . $userUUID, + 'Михаил Гришин | ' . $userUUID, + '+7978 888 22 22', + 'grishi@rarus.ru', + Users\DTO\Gender\Fabric::getMale(), + new DateTime('now', \TestEnvironmentManager::getDefaultTimezone()) + ); + } + /** * @return Users\DTO\User * @throws Exception */ public static function createNewUserWithWinterBirthday(): \Rarus\BonusServer\Users\DTO\User { + $userUUID = random_int(0, PHP_INT_MAX); + return \Rarus\BonusServer\Users\DTO\Fabric::createNewInstance( - 'grishi-' . random_int(0, PHP_INT_MAX), - 'Михаил Гришин', + 'grishi-' . $userUUID, + 'Михаил Гришин | ' . $userUUID, '+7978 888 22 22', 'grishi@rarus.ru', Users\DTO\Gender\Fabric::getMale(), @@ -136,9 +166,11 @@ public static function createNewUserWithWinterBirthday(): \Rarus\BonusServer\Use */ public static function createNewUserWithoutBirthday(): \Rarus\BonusServer\Users\DTO\User { + $userUUID = random_int(0, PHP_INT_MAX); + return \Rarus\BonusServer\Users\DTO\Fabric::createNewInstance( - 'grishi-' . random_int(0, PHP_INT_MAX), - 'Михаил Гришин', + 'grishi-' . $userUUID, + 'Михаил Гришин | ' . $userUUID, '+7978 888 22 22', 'grishi@rarus.ru', Users\DTO\Gender\Fabric::getMale() diff --git a/tests/TestEnvironmentManager.php b/tests/TestEnvironmentManager.php index 332411d..3e2f82f 100644 --- a/tests/TestEnvironmentManager.php +++ b/tests/TestEnvironmentManager.php @@ -27,11 +27,11 @@ class TestEnvironmentManager /** * @var string */ - private const LOGIN = 'beligo'; + private const LOGIN = 'mesm'; /** * @var string */ - private const PASSWORD = 'ef2ba1a5da4aa1d2e22fe2d2697cba94e5a7d9d0'; + private const PASSWORD = '3a9e090168bf592bcc35990bcc9fab9aff090004'; /** * @var string */ diff --git a/tests/src/Rarus/BonusServer/Users/Transport/Role/Organization/TransportTest.php b/tests/src/Rarus/BonusServer/Users/Transport/Role/Organization/TransportTest.php index ae97787..5278a92 100644 --- a/tests/src/Rarus/BonusServer/Users/Transport/Role/Organization/TransportTest.php +++ b/tests/src/Rarus/BonusServer/Users/Transport/Role/Organization/TransportTest.php @@ -32,6 +32,10 @@ class TransportTest extends TestCase */ public function testGetByUserIdMethod(): void { + // гарантированно создаём карту для привязки к пользователю, если карт нет, то юзера не создать + $newFreeCard = \DemoDataGenerator::createNewCard(); + $this->cardTransport->addNewCard($newFreeCard); + $user = $this->userTransport->addNewUser(\DemoDataGenerator::createNewUser()); $user2 = $this->userTransport->getByUserId($user->getUserId()); @@ -45,11 +49,14 @@ public function testGetByUserIdMethod(): void */ public function testAddNewUserMethod(): void { + // гарантированно создаём карту для привязки к пользователю, если карт нет, то юзера не создать + $newFreeCard = \DemoDataGenerator::createNewCard(); + $this->cardTransport->addNewCard($newFreeCard); + // создаём нового юзера $newUser = \DemoDataGenerator::createNewUser(); + // пробуем его добавить $user = $this->userTransport->addNewUser($newUser); - $this->assertEquals('grishi@rarus.ru', $user->getEmail()); - $this->assertEquals($newUser->getBirthdate()->getTimestamp(), $user->getBirthdate()->getTimestamp()); $this->assertEquals($newUser->getBirthdate()->format('d.m.Y H:i:s'), $user->getBirthdate()->format('d.m.Y H:i:s')); } @@ -58,11 +65,30 @@ public function testAddNewUserMethod(): void */ public function testAddNewUserWithSummerBirthdayMethod(): void { + // гарантированно создаём карту для привязки к пользователю, если карт нет, то юзера не создать + $newFreeCard = \DemoDataGenerator::createNewCard(); + $this->cardTransport->addNewCard($newFreeCard); + $newUser = \DemoDataGenerator::createNewUserWithSummerBirthday(); $user = $this->userTransport->addNewUser($newUser); $this->assertEquals($newUser->getEmail(), $user->getEmail()); - $this->assertEquals($newUser->getBirthdate()->getTimestamp(), $user->getBirthdate()->getTimestamp()); + $this->assertEquals($newUser->getBirthdate()->format('d.m.Y H:i:s'), $user->getBirthdate()->format('d.m.Y H:i:s')); + } + + /** + * @covers \Rarus\BonusServer\Users\Transport\Role\Organization\Transport::addNewUser() + */ + public function testAddNewUserWithNowDateTimeBirthdayMethod(): void + { + // гарантированно создаём карту для привязки к пользователю, если карт нет, то юзера не создать + $newFreeCard = \DemoDataGenerator::createNewCard(); + $this->cardTransport->addNewCard($newFreeCard); + + $newUser = \DemoDataGenerator::createNewUserWithNowDateTimeBirthday(); + $user = $this->userTransport->addNewUser($newUser); + + $this->assertEquals($newUser->getEmail(), $user->getEmail()); $this->assertEquals($newUser->getBirthdate()->format('d.m.Y H:i:s'), $user->getBirthdate()->format('d.m.Y H:i:s')); } @@ -71,11 +97,14 @@ public function testAddNewUserWithSummerBirthdayMethod(): void */ public function testAddNewUserWithWinterBirthdayMethod(): void { + // гарантированно создаём карту для привязки к пользователю, если карт нет, то юзера не создать + $newFreeCard = \DemoDataGenerator::createNewCard(); + $this->cardTransport->addNewCard($newFreeCard); + $newUser = \DemoDataGenerator::createNewUserWithWinterBirthday(); $user = $this->userTransport->addNewUser($newUser); $this->assertEquals($newUser->getEmail(), $user->getEmail()); - $this->assertEquals($newUser->getBirthdate()->getTimestamp(), $user->getBirthdate()->getTimestamp()); $this->assertEquals($newUser->getBirthdate()->format('d.m.Y H:i:s'), $user->getBirthdate()->format('d.m.Y H:i:s')); } @@ -84,6 +113,10 @@ public function testAddNewUserWithWinterBirthdayMethod(): void */ public function testAddNewUserWithoutBirthday(): void { + // гарантированно создаём карту для привязки к пользователю, если карт нет, то юзера не создать + $newFreeCard = \DemoDataGenerator::createNewCard(); + $this->cardTransport->addNewCard($newFreeCard); + $newUser = \DemoDataGenerator::createNewUserWithoutBirthday(); $user = $this->userTransport->addNewUser($newUser); @@ -95,6 +128,10 @@ public function testAddNewUserWithoutBirthday(): void */ public function testAddNewUserAndAttachFreeCardMethod(): void { + // гарантированно создаём карту для привязки к пользователю, если карт нет, то юзера не создать + $newFreeCard = \DemoDataGenerator::createNewCard(); + $this->cardTransport->addNewCard($newFreeCard); + $newUser = \DemoDataGenerator::createNewUser(); $user = $this->userTransport->addNewUserAndAttachFreeCard($newUser); // юзера вычитали корректного