aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/Command/AsyncBusTestCase.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/Command/AsyncBusTestCase.php')
-rw-r--r--tests/lib/Command/AsyncBusTestCase.php180
1 files changed, 180 insertions, 0 deletions
diff --git a/tests/lib/Command/AsyncBusTestCase.php b/tests/lib/Command/AsyncBusTestCase.php
new file mode 100644
index 00000000000..c4f173f8b32
--- /dev/null
+++ b/tests/lib/Command/AsyncBusTestCase.php
@@ -0,0 +1,180 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace Test\Command;
+
+use OC\Command\FileAccess;
+use OCP\Command\IBus;
+use OCP\Command\ICommand;
+use Test\TestCase;
+
+class SimpleCommand implements ICommand {
+ public function handle() {
+ AsyncBusTestCase::$lastCommand = 'SimpleCommand';
+ }
+}
+
+class StateFullCommand implements ICommand {
+ private $state;
+
+ public function __construct($state) {
+ $this->state = $state;
+ }
+
+ public function handle() {
+ AsyncBusTestCase::$lastCommand = $this->state;
+ }
+}
+
+class FilesystemCommand implements ICommand {
+ use FileAccess;
+
+ public function handle() {
+ AsyncBusTestCase::$lastCommand = 'FileAccess';
+ }
+}
+
+function basicFunction() {
+ AsyncBusTestCase::$lastCommand = 'function';
+}
+
+// clean class to prevent phpunit putting closure in $this
+class ThisClosureTest {
+ private function privateMethod() {
+ AsyncBusTestCase::$lastCommand = 'closure-this';
+ }
+
+ public function test(IBus $bus) {
+ $bus->push(function () {
+ $this->privateMethod();
+ });
+ }
+}
+
+abstract class AsyncBusTestCase extends TestCase {
+ /**
+ * Basic way to check output from a command
+ *
+ * @var string
+ */
+ public static $lastCommand;
+
+ /**
+ * @var \OCP\Command\IBus
+ */
+ private $bus;
+
+ public static function DummyCommand() {
+ self::$lastCommand = 'static';
+ }
+
+ /**
+ * @return IBus
+ */
+ protected function getBus() {
+ if (!$this->bus instanceof IBus) {
+ $this->bus = $this->createBus();
+ }
+ return $this->bus;
+ }
+
+ /**
+ * @return IBus
+ */
+ abstract protected function createBus();
+
+ protected function setUp(): void {
+ self::$lastCommand = '';
+ }
+
+ public function testSimpleCommand(): void {
+ $command = new SimpleCommand();
+ $this->getBus()->push($command);
+ $this->runJobs();
+ $this->assertEquals('SimpleCommand', self::$lastCommand);
+ }
+
+ public function testStateFullCommand(): void {
+ $command = new StateFullCommand('foo');
+ $this->getBus()->push($command);
+ $this->runJobs();
+ $this->assertEquals('foo', self::$lastCommand);
+ }
+
+ public function testStaticCallable(): void {
+ $this->getBus()->push(['\Test\Command\AsyncBusTestCase', 'DummyCommand']);
+ $this->runJobs();
+ $this->assertEquals('static', self::$lastCommand);
+ }
+
+ public function testMemberCallable(): void {
+ $command = new StateFullCommand('bar');
+ $this->getBus()->push([$command, 'handle']);
+ $this->runJobs();
+ $this->assertEquals('bar', self::$lastCommand);
+ }
+
+ public function testFunctionCallable(): void {
+ $this->getBus()->push('\Test\Command\BasicFunction');
+ $this->runJobs();
+ $this->assertEquals('function', self::$lastCommand);
+ }
+
+ public function testClosure(): void {
+ $this->getBus()->push(function () {
+ AsyncBusTestCase::$lastCommand = 'closure';
+ });
+ $this->runJobs();
+ $this->assertEquals('closure', self::$lastCommand);
+ }
+
+ public function testClosureSelf(): void {
+ $this->getBus()->push(function () {
+ AsyncBusTestCase::$lastCommand = 'closure-self';
+ });
+ $this->runJobs();
+ $this->assertEquals('closure-self', self::$lastCommand);
+ }
+
+
+ public function testClosureThis(): void {
+ // clean class to prevent phpunit putting closure in $this
+ $test = new ThisClosureTest();
+ $test->test($this->getBus());
+ $this->runJobs();
+ $this->assertEquals('closure-this', self::$lastCommand);
+ }
+
+ public function testClosureBind(): void {
+ $state = 'bar';
+ $this->getBus()->push(function () use ($state) {
+ AsyncBusTestCase::$lastCommand = 'closure-' . $state;
+ });
+ $this->runJobs();
+ $this->assertEquals('closure-bar', self::$lastCommand);
+ }
+
+ public function testFileFileAccessCommand(): void {
+ $this->getBus()->push(new FilesystemCommand());
+ $this->assertEquals('', self::$lastCommand);
+ $this->runJobs();
+ $this->assertEquals('FileAccess', self::$lastCommand);
+ }
+
+ public function testFileFileAccessCommandSync(): void {
+ $this->getBus()->requireSync('\OC\Command\FileAccess');
+ $this->getBus()->push(new FilesystemCommand());
+ $this->assertEquals('FileAccess', self::$lastCommand);
+ self::$lastCommand = '';
+ $this->runJobs();
+ $this->assertEquals('', self::$lastCommand);
+ }
+
+
+ abstract protected function runJobs();
+}