diff --git a/lib/private/Talk/Broker.php b/lib/private/Talk/Broker.php index 6feca955023..103ebc2f215 100644 --- a/lib/private/Talk/Broker.php +++ b/lib/private/Talk/Broker.php @@ -95,4 +95,20 @@ class Broker implements IBroker { $this->backend->deleteConversation($id); } + + public function isAllowedToCreateConversations(): bool { + if (!$this->isEnabledForUser()) { + return false; + } + + return $this->backend->isAllowedToCreateConversations(); + } + + public function isEnabledForUser(): bool { + if (!$this->hasBackend()) { + return false; + } + + return $this->backend->isEnabledForUser(); + } } diff --git a/lib/public/Talk/IBroker.php b/lib/public/Talk/IBroker.php index cfea4af6873..11259e53e33 100644 --- a/lib/public/Talk/IBroker.php +++ b/lib/public/Talk/IBroker.php @@ -65,4 +65,24 @@ interface IBroker { * @since 26.0.0 */ public function deleteConversation(string $id): void; + + /** + * Check if the logged-in user is allowed to create conversations + * + * Also returns false when no backend is available + * + * @return bool + * @since 34.0.0 + */ + public function isAllowedToCreateConversations(): bool; + + /** + * Check if the Talk backend is enabled for the logged-in user + * + * Also returns false when no backend is available + * + * @return bool + * @since 34.0.0 + */ + public function isEnabledForUser(): bool; } diff --git a/lib/public/Talk/ITalkBackend.php b/lib/public/Talk/ITalkBackend.php index 66dbd3c485d..f2fbec7740a 100644 --- a/lib/public/Talk/ITalkBackend.php +++ b/lib/public/Talk/ITalkBackend.php @@ -42,4 +42,22 @@ interface ITalkBackend { * @since 26.0.0 */ public function deleteConversation(string $id): void; + + /** + * Check if the logged-in user is allowed to create conversations + * + * Also returns false when no backend is enabled for the user + * + * @return bool + * @since 34.0.0 + */ + public function isAllowedToCreateConversations(): bool; + + /** + * Check if the Talk backend is enabled for the logged-in user + * + * @return bool + * @since 34.0.0 + */ + public function isEnabledForUser(): bool; } diff --git a/tests/lib/Talk/BrokerTest.php b/tests/lib/Talk/BrokerTest.php index cad0d14b7b2..f49aaef1efd 100644 --- a/tests/lib/Talk/BrokerTest.php +++ b/tests/lib/Talk/BrokerTest.php @@ -17,6 +17,7 @@ use OCP\AppFramework\QueryException; use OCP\IServerContainer; use OCP\Talk\IConversationOptions; use OCP\Talk\ITalkBackend; +use PHPUnit\Framework\Attributes\DataProvider; use Psr\Log\LoggerInterface; use RuntimeException; use Test\TestCase; @@ -52,7 +53,7 @@ class BrokerTest extends TestCase { } public function testHasNoBackend(): void { - $this->coordinator->expects(self::once()) + $this->coordinator->expects($this->once()) ->method('getRegistrationContext') ->willReturn($this->createMock(RegistrationContext::class)); @@ -64,16 +65,16 @@ class BrokerTest extends TestCase { public function testHasFaultyBackend(): void { $fakeTalkServiceClass = '\\OCA\\Spreed\\TalkBackend'; $registrationContext = $this->createMock(RegistrationContext::class); - $this->coordinator->expects(self::once()) + $this->coordinator->expects($this->once()) ->method('getRegistrationContext') ->willReturn($registrationContext); - $registrationContext->expects(self::once()) + $registrationContext->expects($this->once()) ->method('getTalkBackendRegistration') ->willReturn(new ServiceRegistration('spreed', $fakeTalkServiceClass)); - $this->container->expects(self::once()) + $this->container->expects($this->once()) ->method('get') ->willThrowException(new QueryException()); - $this->logger->expects(self::once()) + $this->logger->expects($this->once()) ->method('error'); self::assertFalse( @@ -84,14 +85,14 @@ class BrokerTest extends TestCase { public function testHasBackend(): void { $fakeTalkServiceClass = '\\OCA\\Spreed\\TalkBackend'; $registrationContext = $this->createMock(RegistrationContext::class); - $this->coordinator->expects(self::once()) + $this->coordinator->expects($this->once()) ->method('getRegistrationContext') ->willReturn($registrationContext); - $registrationContext->expects(self::once()) + $registrationContext->expects($this->once()) ->method('getTalkBackendRegistration') ->willReturn(new ServiceRegistration('spreed', $fakeTalkServiceClass)); $talkService = $this->createMock(ITalkBackend::class); - $this->container->expects(self::once()) + $this->container->expects($this->once()) ->method('get') ->with($fakeTalkServiceClass) ->willReturn($talkService); @@ -111,19 +112,19 @@ class BrokerTest extends TestCase { public function testCreateConversation(): void { $fakeTalkServiceClass = '\\OCA\\Spreed\\TalkBackend'; $registrationContext = $this->createMock(RegistrationContext::class); - $this->coordinator->expects(self::once()) + $this->coordinator->expects($this->once()) ->method('getRegistrationContext') ->willReturn($registrationContext); - $registrationContext->expects(self::once()) + $registrationContext->expects($this->once()) ->method('getTalkBackendRegistration') ->willReturn(new ServiceRegistration('spreed', $fakeTalkServiceClass)); $talkService = $this->createMock(ITalkBackend::class); - $this->container->expects(self::once()) + $this->container->expects($this->once()) ->method('get') ->with($fakeTalkServiceClass) ->willReturn($talkService); $options = $this->createMock(IConversationOptions::class); - $talkService->expects(self::once()) + $talkService->expects($this->once()) ->method('createConversation') ->with('Watercooler', [], $options); @@ -133,4 +134,116 @@ class BrokerTest extends TestCase { $options ); } + + public function testIsEnabledForUserNoBackend(): void { + $this->coordinator->expects($this->once()) + ->method('getRegistrationContext') + ->willReturn($this->createMock(RegistrationContext::class)); + + self::assertFalse( + $this->broker->isEnabledForUser() + ); + } + + public static function dataIsEnabledForUser(): array { + return [ + [true], + [false], + ]; + } + + #[DataProvider('dataIsEnabledForUser')] + public function testIsEnabledForUser(bool $enabled): void { + $fakeTalkServiceClass = '\\OCA\\Spreed\\TalkBackend'; + $registrationContext = $this->createMock(RegistrationContext::class); + $this->coordinator->expects($this->once()) + ->method('getRegistrationContext') + ->willReturn($registrationContext); + $registrationContext->expects($this->once()) + ->method('getTalkBackendRegistration') + ->willReturn(new ServiceRegistration('spreed', $fakeTalkServiceClass)); + $talkService = $this->createMock(ITalkBackend::class); + $this->container->expects($this->once()) + ->method('get') + ->with($fakeTalkServiceClass) + ->willReturn($talkService); + $talkService->expects($this->once()) + ->method('isEnabledForUser') + ->willReturn($enabled); + + self::assertSame( + $enabled, + $this->broker->isEnabledForUser() + ); + } + + public function testIsAllowedToCreateConversationsNoBackend(): void { + $this->coordinator->expects($this->once()) + ->method('getRegistrationContext') + ->willReturn($this->createMock(RegistrationContext::class)); + + self::assertFalse( + $this->broker->isAllowedToCreateConversations() + ); + } + + public function testIsAllowedToCreateConversationsBackendDisabled(): void { + $fakeTalkServiceClass = '\\OCA\\Spreed\\TalkBackend'; + $registrationContext = $this->createMock(RegistrationContext::class); + $this->coordinator->expects($this->once()) + ->method('getRegistrationContext') + ->willReturn($registrationContext); + $registrationContext->expects($this->once()) + ->method('getTalkBackendRegistration') + ->willReturn(new ServiceRegistration('spreed', $fakeTalkServiceClass)); + $talkService = $this->createMock(ITalkBackend::class); + $this->container->expects($this->once()) + ->method('get') + ->with($fakeTalkServiceClass) + ->willReturn($talkService); + $talkService->expects($this->once()) + ->method('isEnabledForUser') + ->willReturn(false); + $talkService->expects($this->never()) + ->method('isAllowedToCreateConversations'); + + self::assertFalse( + $this->broker->isAllowedToCreateConversations() + ); + } + + public static function dataIsAllowedToCreateConversations(): array { + return [ + [true], + [false], + ]; + } + + #[DataProvider('dataIsAllowedToCreateConversations')] + public function testIsAllowedToCreateConversations(bool $allowed): void { + $fakeTalkServiceClass = '\\OCA\\Spreed\\TalkBackend'; + $registrationContext = $this->createMock(RegistrationContext::class); + $this->coordinator->expects($this->once()) + ->method('getRegistrationContext') + ->willReturn($registrationContext); + $registrationContext->expects($this->once()) + ->method('getTalkBackendRegistration') + ->willReturn(new ServiceRegistration('spreed', $fakeTalkServiceClass)); + $talkService = $this->createMock(ITalkBackend::class); + $this->container->expects($this->once()) + ->method('get') + ->with($fakeTalkServiceClass) + ->willReturn($talkService); + $talkService->expects($this->once()) + ->method('isEnabledForUser') + ->willReturn(true); + $talkService->expects($this->once()) + ->method('isAllowedToCreateConversations') + ->willReturn($allowed); + + self::assertSame( + $allowed, + $this->broker->isAllowedToCreateConversations() + ); + } }