diff --git a/tests/ZM/Utils/MessageUtilTest.php b/tests/ZM/Utils/MessageUtilTest.php new file mode 100644 index 00000000..131e00d8 --- /dev/null +++ b/tests/ZM/Utils/MessageUtilTest.php @@ -0,0 +1,168 @@ +assertCount(1, EventManager::$events[CQCommand::class]); + $this->assertTrue(true); + } + + /** + * @dataProvider providerTestContainsImage + */ + public function testContainsImage($msg, $expected): void + { + $this->assertEquals($expected, MessageUtil::containsImage($msg)); + } + + public function providerTestContainsImage(): array + { + return [ + 'empty' => ['', false], + 'text only' => ['hello world', false], + 'image only' => ['[CQ:image,file=123456.jpg]', true], + 'image' => ['hello world![CQ:image,file=123456.jpg]', true], + 'two image' => ['hello world![CQ:image,file=123456.jpg][CQ:image,file=123456.jpg]', true], +// 'malformed image' => ['[CQ:image,file=]', false], + ]; + } + + public function testGenerateCommandHelp(): void + { + // 因为内部使用了 WorkerCache,而我们暂时无法模拟 WorkerCache,所以此处无法进行测试 +// EventManager::$events[CQCommand::class] = [ +// new CQCommand('测试命令'), +// new CQCommand('测试命令2', '执行命令*'), +// ]; +// $help = MessageUtil::generateCommandHelp(); +// $this->assertEquals('测试命令', $help[0]); + $this->assertTrue(true); + } + + /** + * @dataProvider providerTestArrayToStr + */ + public function testArrayToStr($array, $expected): void + { + $this->assertEquals($expected, MessageUtil::arrayToStr($array)); + } + + public function providerTestArrayToStr(): array + { + $tmp = $this->providerTestStrToArray(); + $result = []; + foreach ($tmp as $desc => $case) { + $result[$desc] = [$case[1], $case[0]]; + } + return $result; + } + + public function testMatchCommand(): void + { + // 这里理论上需要覆盖所有条件,但先暂时这样好了 + EventManager::$events[CQCommand::class] = [ + new CQCommand('测试命令'), + ]; + $this->assertEquals(true, MessageUtil::matchCommand('测试命令', [ + 'user_id' => '123456', + 'group_id' => '123456', + 'message_type' => 'group', + ])->status); + } + + /** + * @dataProvider providerTestIsAtMe + */ + public function testIsAtMe($msg, $expected): void + { + $this->assertEquals($expected, MessageUtil::isAtMe($msg, 123456789)); + } + + public function providerTestIsAtMe(): array + { + return [ + 'me only' => ['[CQ:at,qq=123456789]', true], + 'empty qq' => ['[CQ:at,qq=]', false], + 'message behind' => ['[CQ:at,qq=123456789] hello', true], + 'message front' => ['hello [CQ:at,qq=123456789]', true], + 'message surround' => ['hello [CQ:at,qq=123456789] world', true], + 'not at me' => ['hello world', false], + 'other' => ['[CQ:at,qq=123456789] hello [CQ:at,qq=987654321]', true], + 'other only' => ['[CQ:at,qq=987654321]', false], + ]; + } + + public function testGetImageCQFromLocal(): void + { + file_put_contents('/tmp/test.jpg', 'test'); + $this->assertEquals('[CQ:image,file=base64://' . base64_encode('test') . ']', MessageUtil::getImageCQFromLocal('/tmp/test.jpg')); + unlink('/tmp/test.jpg'); + } + + /** + * @dataProvider providerTestStrToArray + */ + public function testStrToArray($str, $expected): void + { + $this->assertEquals($expected, MessageUtil::strToArray($str)); + } + + public function providerTestStrToArray(): array + { + $text = static function ($str): array { + return ['type' => 'text', 'data' => ['text' => $str]]; + }; + + return [ + 'empty string' => ['', []], + 'pure string' => ['foobar', [$text('foobar')]], + 'spaced string' => ['hello world', [$text('hello world')]], + 'spaced and multiline string' => ["hello\n world", [$text("hello\n world")]], + 'string containing CQ' => ['[CQ:at,qq=123456789]', [['type' => 'at', 'data' => ['qq' => '123456789']]]], + ]; + } + + /** + * @dataProvider providerTestSplitCommand + */ + public function testSplitCommand($msg, $expected): void + { + $this->assertEquals($expected, MessageUtil::splitCommand($msg)); + } + + public function providerTestSplitCommand(): array + { + return [ + 'spaced' => ['hello world', ['hello', 'world']], + 'multiline' => ["hello\nworld", ['hello', 'world']], + 'many spaces' => ['hello world', ['hello', 'world']], + 'many spaces and multiline' => ["hello\n world", ['hello', 'world']], + 'many parts' => ['hello world foo bar', ['hello', 'world', 'foo', 'bar']], + ]; + } + + public function testDownloadCQImage(): void + { + @unlink(DataProvider::getDataFolder('images') . '/test.jpg'); + $msg = '[CQ:image,file=test.jpg,url=https://zhamao.xin/file/hello.jpg]'; + $result = MessageUtil::downloadCQImage($msg); + $this->assertIsArray($result); + $this->assertCount(1, $result); + $this->assertFileExists(DataProvider::getDataFolder('images') . '/test.jpg'); + unlink(DataProvider::getDataFolder('images') . '/test.jpg'); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 4368c0da..04bc6565 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -25,4 +25,4 @@ if (ZMConfig::get('global') === false) { LightCacheInside::init(); ZMAtomic::init(); Terminal::init(); -Console::setLevel(4); \ No newline at end of file +Console::setLevel(4);