CoreLibraryTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. declare(strict_types=1);
  3. namespace Luolongfei\Tests\Unit;
  4. use Colors\Color;
  5. use GuzzleHttp\Cookie\SetCookie;
  6. use Luolongfei\App\Constants\CommonConst;
  7. use Luolongfei\Libs\Argv;
  8. use Luolongfei\Libs\Config;
  9. use Luolongfei\Libs\Connector\MessageGateway;
  10. use Luolongfei\Libs\Env;
  11. use Luolongfei\Libs\IP;
  12. use Luolongfei\Libs\Lang;
  13. use Luolongfei\Libs\Log;
  14. use Luolongfei\Libs\PhpColor;
  15. use Luolongfei\Tests\TestCase;
  16. use Monolog\Logger;
  17. final class CoreLibraryTest extends TestCase
  18. {
  19. public function testBaseCachesInstancesAndRunsInitOnce(): void
  20. {
  21. $first = SingletonFixture::getInstance();
  22. $second = SingletonFixture::getInstance();
  23. self::assertSame($first, $second);
  24. self::assertSame(1, $first->initCalls);
  25. }
  26. public function testEnvCastsCommonValues(): void
  27. {
  28. $this->setEnvValues([
  29. 'UNIT_BOOL_TRUE' => 'true',
  30. 'UNIT_BOOL_FALSE' => '(false)',
  31. 'UNIT_EMPTY' => '(empty)',
  32. 'UNIT_QUOTED' => '"quoted value"',
  33. ]);
  34. self::assertTrue(env('UNIT_BOOL_TRUE'));
  35. self::assertFalse(env('UNIT_BOOL_FALSE'));
  36. self::assertSame('', env('UNIT_EMPTY'));
  37. self::assertSame('quoted value', env('UNIT_QUOTED'));
  38. self::assertInstanceOf(Env::class, Env::getInstance());
  39. }
  40. public function testConfigReadsNestedValuesFromEnvironment(): void
  41. {
  42. $this->setEnvValues([
  43. 'CUSTOM_LANGUAGE' => 'zh',
  44. 'CUSTOM_TELEGRAM_HOST' => 'telegram.example.test',
  45. ]);
  46. self::assertSame('telegram.example.test', config('message.telegram.host'));
  47. self::assertSame(1, config('notice_freq'));
  48. self::assertInstanceOf(Config::class, Config::getInstance());
  49. }
  50. public function testLangReturnsRootAndNestedMessages(): void
  51. {
  52. $this->setEnvValues([
  53. 'CUSTOM_LANGUAGE' => 'zh',
  54. ]);
  55. self::assertSame('邮件', lang('100064'));
  56. self::assertStringContainsString('freenom 账户信息', (string) lang('exception_msg.34520001'));
  57. self::assertInstanceOf(Lang::class, Lang::getInstance());
  58. }
  59. public function testArgvParsesShortAndLongFlags(): void
  60. {
  61. global $argv;
  62. $argv = ['run', '-c=FreeNom', '--m=handle', '--flag'];
  63. $this->resetProjectState();
  64. self::assertSame('FreeNom', get_argv('c'));
  65. self::assertSame('handle', get_argv('m'));
  66. self::assertTrue(Argv::getInstance()->get('flag'));
  67. }
  68. public function testMessageGatewayHelpersWorkWithoutNetwork(): void
  69. {
  70. $this->setEnvValues([
  71. 'SHOW_SERVER_INFO' => '0',
  72. ]);
  73. $gateway = new GatewayFixture();
  74. $footer = '';
  75. self::assertSame('Hello world', $gateway->genMessageContent(['world'], 'Hello %s'));
  76. self::assertSame("a<br>b", $gateway->newLine2Br("a\nb"));
  77. $gateway->setCommonFooter($footer);
  78. self::assertStringContainsString('NOTICE_FREQ', $footer);
  79. }
  80. public function testHelperFunctionsAndConstantsReturnExpectedValues(): void
  81. {
  82. $this->setEnvValues([
  83. 'CUSTOM_LANGUAGE' => 'en',
  84. ]);
  85. $cookie = buildAwsWafCookie('token-123');
  86. self::assertSame('21st', get_local_num(21));
  87. self::assertSame(20, getSleepTime(1));
  88. self::assertSame(24, getSleepTime(6, 4, 20));
  89. self::assertInstanceOf(SetCookie::class, $cookie);
  90. self::assertSame('aws-waf-token', $cookie->getName());
  91. self::assertSame('token-123', $cookie->getValue());
  92. self::assertSame(CommonConst::AWS_WAF_TOKEN, 'AWS_WAF_TOKEN');
  93. self::assertMatchesRegularExpression('/^\d+\.\d+\.\d+\.\d+$/', get_random_user_agent());
  94. self::assertInstanceOf(Color::class, PhpColor::getInstance()->getColorInstance());
  95. }
  96. public function testIpParserAndLogFacadeWorkWithoutRemoteCalls(): void
  97. {
  98. $this->setEnvValues([
  99. 'CUSTOM_LANGUAGE' => 'en',
  100. ]);
  101. $ip = $this->newInstanceWithoutConstructor(IP::class);
  102. $this->invokeMethod($ip, 'setIpInfo', ['{"ip":"1.1.1.1","country":"US","region":"CA","city":"SF"}']);
  103. self::assertSame('1.1.1.1', IP::$ip);
  104. self::assertSame('US CA SF', IP::$loc);
  105. self::assertInstanceOf(Logger::class, Log::logger());
  106. Log::info('unit-test');
  107. Log::error('unit-test');
  108. self::assertTrue(true);
  109. }
  110. }
  111. final class SingletonFixture extends \Luolongfei\Libs\Base
  112. {
  113. public int $initCalls = 0;
  114. public function init(): void
  115. {
  116. $this->initCalls++;
  117. }
  118. }
  119. final class GatewayFixture extends MessageGateway
  120. {
  121. public function send(string $content, string $subject = '', int $type = 1, array $data = [], ?string $recipient = null, ...$params)
  122. {
  123. return true;
  124. }
  125. }