BxDolIntegrationTestCase.php 5.8 KB

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