ConsoleModulesTest.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. declare(strict_types=1);
  3. namespace Luolongfei\Tests\Unit;
  4. use Luolongfei\App\Console\Base;
  5. use Luolongfei\App\Console\FreeNom;
  6. use Luolongfei\App\Console\GlobalValue;
  7. use Luolongfei\App\Console\MigrateEnvFile;
  8. use Luolongfei\App\Console\Upgrade;
  9. use Luolongfei\App\Exceptions\LlfException;
  10. use Luolongfei\App\Exceptions\WarningException;
  11. use Luolongfei\Tests\TestCase;
  12. final class ConsoleModulesTest extends TestCase
  13. {
  14. public function testConsoleBaseExtractsVersionNumber(): void
  15. {
  16. $base = new Base();
  17. self::assertSame('1.2.3', $base->getVerNum('v1.2.3'));
  18. self::assertNull($base->getVerNum('no-version'));
  19. }
  20. public function testGlobalValueSupportsCrudOperations(): void
  21. {
  22. $store = GlobalValue::getInstance();
  23. $store->set('foo', 'bar');
  24. self::assertTrue($store->has('foo'));
  25. self::assertSame('bar', $store->get('foo'));
  26. $store->del('foo');
  27. self::assertFalse($store->has('foo'));
  28. self::assertSame('fallback', $store->get('foo', 'fallback'));
  29. }
  30. public function testCustomExceptionsEmbedFormattedMessagesAndCodes(): void
  31. {
  32. $this->setEnvValues([
  33. 'CUSTOM_LANGUAGE' => 'zh',
  34. ]);
  35. $llf = new LlfException(34520002, 'boom');
  36. $warning = new WarningException(34520014, ['[email protected]', 'no domain']);
  37. self::assertStringContainsString('boom', $llf->getMessage());
  38. self::assertStringContainsString('Error code: 34520002', $llf->getMessage());
  39. self::assertStringContainsString('Warning code: 34520014', $warning->getMessage());
  40. }
  41. public function testFreeNomProtectedParsingHelpersWorkOnExpectedMarkup(): void
  42. {
  43. $freenom = $this->newInstanceWithoutConstructor(FreeNom::class);
  44. $this->setProperty($freenom, 'username', '[email protected]');
  45. $page = <<<'HTML'
  46. <html>
  47. <body>
  48. <li>Logout</li>
  49. <input type="hidden" name="token" value="token-123">
  50. <table>
  51. <tr><td>alpha.tk</td><td>Active</td><td>expires <span class="status">10 days</span><a href="/renew?foo=1&domain=123">renew</a></td></tr>
  52. <tr><td>beta.ml</td><td>Active</td><td>expires <span class="status">20 days</span><a href="/renew?foo=1&domain=456">renew</a></td></tr>
  53. </table>
  54. </body>
  55. </html>
  56. HTML;
  57. $domains = $this->invokeMethod($freenom, 'getAllDomains', [$page]);
  58. self::assertCount(2, $domains);
  59. self::assertSame('alpha.tk', $domains[0]['domain']);
  60. self::assertSame('10', $domains[0]['days']);
  61. self::assertSame('123', $domains[0]['id']);
  62. self::assertSame('token-123', $this->invokeMethod($freenom, 'getToken', [$page]));
  63. }
  64. public function testFreeNomArrayUniqueKeepsDistinctCredentialPairs(): void
  65. {
  66. $freenom = $this->newInstanceWithoutConstructor(FreeNom::class);
  67. $accounts = [
  68. ['username' => 'ab', 'password' => 'c'],
  69. ['username' => 'a', 'password' => 'bc'],
  70. ['username' => 'ab', 'password' => 'c'],
  71. ];
  72. self::assertTrue($freenom->arrayUnique($accounts));
  73. self::assertCount(2, $accounts);
  74. }
  75. public function testUpgradeFormatsReleaseMessageWithoutHttpCalls(): void
  76. {
  77. $this->setEnvValues([
  78. 'CUSTOM_LANGUAGE' => 'zh',
  79. ]);
  80. $upgrade = $this->newInstanceWithoutConstructor(Upgrade::class);
  81. $this->setProperty($upgrade, 'releaseInfo', [
  82. 'published_at' => '2024-01-01T00:00:00Z',
  83. 'body' => "Line 1\nLine 2",
  84. 'html_url' => 'https://example.test/releases/v9.9.9',
  85. ]);
  86. $this->setProperty($upgrade, 'latestVer', '9.9.9');
  87. $this->setProperty($upgrade, 'currVer', '0.6.2');
  88. self::assertStringStartsWith('2024-01-01', $upgrade->friendlyDateFormat('2024-01-01T00:00:00Z', 'UTC'));
  89. self::assertStringContainsString('v9.9.9', $upgrade->genMsgContent());
  90. self::assertStringContainsString('https://example.test/releases/v9.9.9', $upgrade->genMsgContent());
  91. }
  92. public function testMigrateEnvFileEscapesStringValues(): void
  93. {
  94. $migrator = $this->newInstanceWithoutConstructor(MigrateEnvFile::class);
  95. self::assertSame("COUNT=1", $migrator->formatEnvVal('COUNT', 1));
  96. self::assertSame("SECRET='a\\'b\\\\c\\nnext'", $migrator->formatEnvVal('SECRET', "a'b\\c\nnext"));
  97. }
  98. }