BxDolIntegrationTestCase.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. /**
  3. * Shared helpers for integration tests that talk to a live UNA install.
  4. */
  5. abstract class BxDolIntegrationTestCase extends BxDolTestCase
  6. {
  7. protected $_aAccountAuthBackups;
  8. protected $_aLoggedBackup;
  9. protected $_aPostBackup;
  10. protected $_aCookieBackup;
  11. protected function setUp(): void
  12. {
  13. $this->_aAccountAuthBackups = [];
  14. foreach (['admin', 'user'] as $sKind) {
  15. $oAccount = BxDolAccount::getInstance($this->bxTestEmail($sKind));
  16. if (!$oAccount)
  17. continue;
  18. $aInfo = $oAccount->getInfo();
  19. $this->_aAccountAuthBackups[(int)$oAccount->id()] = [
  20. 'login_attempts' => (int)$aInfo['login_attempts'],
  21. 'locked' => (int)$aInfo['locked'],
  22. ];
  23. }
  24. $this->_aLoggedBackup = [
  25. 'member' => !empty($GLOBALS['logged']['member']),
  26. 'admin' => !empty($GLOBALS['logged']['admin']),
  27. ];
  28. $this->_aPostBackup = $_POST;
  29. $this->_aCookieBackup = $_COOKIE;
  30. }
  31. protected function tearDown(): void
  32. {
  33. $this->bxBecomeGuest();
  34. $this->bxRestoreAccountAuth();
  35. $_POST = $this->_aPostBackup ?? [];
  36. $_COOKIE = $this->_aCookieBackup ?? [];
  37. BxDolForm::unSetObjectInstance('sys_login', 'sys_login');
  38. $GLOBALS['logged']['member'] = $this->_aLoggedBackup['member'] ?? false;
  39. $GLOBALS['logged']['admin'] = $this->_aLoggedBackup['admin'] ?? false;
  40. }
  41. protected function bxAccount(string $sKind = 'admin'): BxDolAccount
  42. {
  43. $sEmail = $this->bxTestEmail($sKind);
  44. $oAccount = BxDolAccount::getInstance($sEmail, true);
  45. if (!$oAccount)
  46. $this->markTestSkipped('Account ' . $sEmail . ' is not installed.');
  47. return $oAccount;
  48. }
  49. protected function bxBecomeGuest(): void
  50. {
  51. $oSession = BxDolSession::getInstance();
  52. if ($oSession->getId() || $oSession->getUserId() || isLogged())
  53. bx_logout(false);
  54. unset($_COOKIE['memberID'], $_COOKIE['memberPassword'], $_COOKIE[BX_DOL_SESSION_COOKIE]);
  55. $this->bxSetLoggedFlags(0);
  56. }
  57. protected function bxSetLoggedFlags(int $iRole): void
  58. {
  59. $GLOBALS['logged']['member'] = (bool)($iRole & BX_DOL_ROLE_MEMBER);
  60. $GLOBALS['logged']['admin'] = (bool)($iRole & BX_DOL_ROLE_ADMIN);
  61. }
  62. protected function bxSyncSessionCookie(): void
  63. {
  64. $sId = BxDolSession::getInstance()->getId();
  65. if ($sId)
  66. $_COOKIE[BX_DOL_SESSION_COOKIE] = $sId;
  67. else
  68. unset($_COOKIE[BX_DOL_SESSION_COOKIE]);
  69. }
  70. protected function bxLoginAs(string $sKind = 'admin', bool $bRememberMe = false): array
  71. {
  72. $oAccount = $this->bxAccount($sKind);
  73. $aInfo = bx_login($oAccount->id(), $bRememberMe);
  74. $this->assertIsArray($aInfo, 'bx_login should return account info.');
  75. $this->assertSame((int)$oAccount->id(), (int)BxDolSession::getInstance()->getUserId());
  76. $this->bxSyncSessionCookie();
  77. $this->bxSetLoggedFlags((int)$aInfo['role']);
  78. return $aInfo;
  79. }
  80. protected function bxLoginAsAdmin(bool $bRememberMe = false): array
  81. {
  82. return $this->bxLoginAs('admin', $bRememberMe);
  83. }
  84. protected function bxLoginAsUser(bool $bRememberMe = false): array
  85. {
  86. return $this->bxLoginAs('user', $bRememberMe);
  87. }
  88. protected function bxSubmitLoginForm(string $sEmail, string $sPassword): BxBaseFormLogin
  89. {
  90. BxDolForm::unSetObjectInstance('sys_login', 'sys_login');
  91. $_POST = [
  92. 'ID' => $sEmail,
  93. 'Password' => $sPassword,
  94. 'role' => (string)BX_DOL_ROLE_MEMBER,
  95. 'login' => '1',
  96. ];
  97. $oForm = BxDolForm::getObjectInstance('sys_login', 'sys_login');
  98. $this->assertInstanceOf(BxBaseFormLogin::class, $oForm);
  99. $oForm->aParams['csrf']['disable'] = true;
  100. $oForm->initChecker();
  101. return $oForm;
  102. }
  103. protected function bxTestEmail(string $sKind = 'admin'): string
  104. {
  105. $this->bxAssertAccountKind($sKind);
  106. return $sKind === 'user'
  107. ? $this->bxEnv('UNA_TEST_USER_EMAIL', 'user@example.com')
  108. : $this->bxEnv('UNA_TEST_ADMIN_EMAIL', 'admin@example.com');
  109. }
  110. protected function bxTestPassword(string $sKind = 'admin'): string
  111. {
  112. $this->bxAssertAccountKind($sKind);
  113. return $sKind === 'user'
  114. ? $this->bxEnv('UNA_TEST_USER_PASSWORD', 'unauna')
  115. : $this->bxEnv('UNA_TEST_ADMIN_PASSWORD', 'unauna');
  116. }
  117. protected function bxAssertAccountKind(string $sKind): void
  118. {
  119. if ($sKind !== 'admin' && $sKind !== 'user')
  120. $this->fail('Unknown test account kind: ' . $sKind);
  121. }
  122. protected function bxEnv(string $sName, string $sDefault): string
  123. {
  124. $s = getenv($sName);
  125. if ($s === false || $s === '')
  126. $s = $_ENV[$sName] ?? $_SERVER[$sName] ?? '';
  127. return ($s !== '') ? (string)$s : $sDefault;
  128. }
  129. protected function bxRestoreAccountAuth(): void
  130. {
  131. if (!$this->_aAccountAuthBackups)
  132. return;
  133. foreach ($this->_aAccountAuthBackups as $iId => $aBackup) {
  134. BxDolDb::getInstance()->query("UPDATE `sys_accounts` SET `login_attempts` = :attempts, `locked` = :locked WHERE `id` = :id", [
  135. 'attempts' => $aBackup['login_attempts'],
  136. 'locked' => $aBackup['locked'],
  137. 'id' => $iId,
  138. ]);
  139. BxDolAccount::getInstance($iId, true);
  140. }
  141. }
  142. }