Merge pull request #59918 from nextcloud/feat/check-if-talk-enabled

feat(ocp): expose whether talk is enabled for user
This commit is contained in:
Anna 2026-05-04 11:03:52 +01:00 committed by GitHub
commit 57c57d7082
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 179 additions and 12 deletions

View file

@ -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();
}
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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()
);
}
}