refactor(dependency-injection): Port away from query where possible

Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
This commit is contained in:
Carl Schwan 2025-09-28 13:12:29 +02:00
parent 81d0c73700
commit 03f5effc75
27 changed files with 205 additions and 197 deletions

View file

@ -137,20 +137,20 @@ class Application extends App implements IBootstrap {
*/
$context->registerService(IProvider::class, function (IAppContainer $appContainer) {
/** @var IServerContainer $serverContainer */
$serverContainer = $appContainer->query(IServerContainer::class);
return $serverContainer->query(IProvider::class);
$serverContainer = $appContainer->get(IServerContainer::class);
return $serverContainer->get(IProvider::class);
});
$context->registerService(IManager::class, function (IAppContainer $appContainer) {
/** @var IServerContainer $serverContainer */
$serverContainer = $appContainer->query(IServerContainer::class);
$serverContainer = $appContainer->get(IServerContainer::class);
return $serverContainer->getSettingsManager();
});
$context->registerService(NewUserMailHelper::class, function (IAppContainer $appContainer) {
/** @var Server $server */
$server = $appContainer->query(IServerContainer::class);
$server = $appContainer->get(IServerContainer::class);
/** @var Defaults $defaults */
$defaults = $server->query(Defaults::class);
$defaults = $server->get(Defaults::class);
return new NewUserMailHelper(
$defaults,
@ -234,7 +234,7 @@ class Application extends App implements IBootstrap {
*/
public function onChangePassword(array $parameters) {
/** @var Hooks $hooks */
$hooks = $this->getContainer()->query(Hooks::class);
$hooks = $this->getContainer()->get(Hooks::class);
$hooks->onChangePassword($parameters['uid']);
}
@ -251,7 +251,7 @@ class Application extends App implements IBootstrap {
}
/** @var Hooks $hooks */
$hooks = $this->getContainer()->query(Hooks::class);
$hooks = $this->getContainer()->get(Hooks::class);
$hooks->onChangeEmail($parameters['user'], $parameters['old_value']);
}
}

View file

@ -3745,11 +3745,6 @@
<code><![CDATA[isAdmin]]></code>
</UndefinedInterfaceMethod>
</file>
<file src="lib/private/InitialStateService.php">
<UndefinedInterfaceMethod>
<code><![CDATA[query]]></code>
</UndefinedInterfaceMethod>
</file>
<file src="lib/private/IntegrityCheck/Checker.php">
<InvalidArrayAccess>
<code><![CDATA[$x509->getDN(X509::DN_OPENSSL)['CN']]]></code>

View file

@ -21,6 +21,7 @@ use OCP\Diagnostics\IEventLogger;
use OCP\HintException;
use OCP\IRequest;
use OCP\Profiler\IProfiler;
use Psr\Container\ContainerExceptionInterface;
/**
* Entry point for every request in your app. You can consider this as your
@ -117,7 +118,7 @@ class App {
// first try $controllerName then go for \OCA\AppName\Controller\$controllerName
try {
$controller = $container->get($controllerName);
} catch (QueryException $e) {
} catch (ContainerExceptionInterface) {
if (str_contains($controllerName, '\\Controller\\')) {
// This is from a global registered app route that is not enabled.
[/*OC(A)*/, $app, /* Controller/Name*/] = explode('\\', $controllerName, 3);
@ -130,7 +131,7 @@ class App {
$appNameSpace = self::buildAppNamespace($appName);
}
$controllerName = $appNameSpace . '\\Controller\\' . $controllerName;
$controller = $container->query($controllerName);
$controller = $container->get($controllerName);
}
$eventLogger->end('app:controller:load');

View file

@ -99,7 +99,7 @@ class Coordinator {
$this->eventLogger->start("bootstrap:register_app:$appId:application", "Load `Application` instance for $appId");
try {
/** @var IBootstrap&App $application */
$application = $this->serverContainer->query($applicationClassName);
$application = $this->serverContainer->get($applicationClassName);
$apps[$appId] = $application;
} catch (ContainerExceptionInterface $e) {
// Weird, but ok
@ -163,7 +163,7 @@ class Coordinator {
$this->eventLogger->start('bootstrap:boot_app:' . $appId, "Call `Application::boot` for $appId");
try {
/** @var App $application */
$application = $this->serverContainer->query($applicationClassName);
$application = $this->serverContainer->get($applicationClassName);
if ($application instanceof IBootstrap) {
/** @var BootContext $context */
$context = new BootContext($application->getContainer());

View file

@ -60,6 +60,7 @@ use OCP\ISession;
use OCP\IURLGenerator;
use OCP\IUserSession;
use OCP\Security\Ip\IRemoteAddress;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
@ -263,7 +264,7 @@ class DIContainer extends SimpleContainer implements IAppContainer {
* @return string the name of your application
*/
public function getAppName() {
return $this->query('appName');
return $this->get('appName');
}
/**
@ -293,8 +294,8 @@ class DIContainer extends SimpleContainer implements IAppContainer {
* @param string $serviceName e.g. 'OCA\Files\Capabilities'
*/
public function registerCapability($serviceName) {
$this->query('OC\CapabilitiesManager')->registerCapability(function () use ($serviceName) {
return $this->query($serviceName);
$this->get('OC\CapabilitiesManager')->registerCapability(function () use ($serviceName) {
return $this->get($serviceName);
});
}
@ -322,10 +323,10 @@ class DIContainer extends SimpleContainer implements IAppContainer {
try {
return $this->queryNoFallback($name);
} catch (QueryException $firstException) {
} catch (ContainerExceptionInterface $firstException) {
try {
return $this->getServer()->query($name, $autoload);
} catch (QueryException $secondException) {
} catch (ContainerExceptionInterface $secondException) {
if ($firstException->getCode() === 1) {
throw $secondException;
}
@ -334,28 +335,30 @@ class DIContainer extends SimpleContainer implements IAppContainer {
}
}
public function get(string $id): mixed {
return $this->query($id);
}
/**
* @param string $name
* @return mixed
* @throws QueryException if the query could not be resolved
*/
public function queryNoFallback($name) {
public function queryNoFallback(string $name): mixed {
$name = $this->sanitizeName($name);
if ($this->offsetExists($name)) {
return parent::query($name);
if ($this->has($name)) {
return parent::get($name);
} elseif ($this->appName === 'settings' && str_starts_with($name, 'OC\\Settings\\')) {
return parent::query($name);
return parent::get($name);
} elseif ($this->appName === 'core' && str_starts_with($name, 'OC\\Core\\')) {
return parent::query($name);
return parent::get($name);
} elseif (str_starts_with($name, \OC\AppFramework\App::buildAppNamespace($this->appName) . '\\')) {
return parent::query($name);
return parent::get($name);
} elseif (
str_starts_with($name, 'OC\\AppFramework\\Services\\')
|| str_starts_with($name, 'OC\\AppFramework\\Middleware\\')
) {
/* AppFramework services are scoped to the application */
return parent::query($name);
return parent::get($name);
}
throw new QueryException('Could not resolve ' . $name . '!'

View file

@ -10,6 +10,7 @@ namespace OC\AppFramework\Utility;
use ArrayAccess;
use Closure;
use OCP\AppFramework\QueryException;
use OCP\AppFramework\Services\IAppConfig;
use OCP\IContainer;
use Pimple\Container;
use Psr\Container\ContainerExceptionInterface;
@ -42,7 +43,16 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer {
* @psalm-return (S is class-string<T> ? T : mixed)
*/
public function get(string $id): mixed {
return $this->query($id);
$name = $this->sanitizeName($id);
if (isset($this->container[$name])) {
return $this->container[$name];
}
$object = $this->resolve($name);
$this->registerService($name, function () use ($object) {
return $object;
});
return $object;
}
public function has(string $id): bool {
@ -76,40 +86,50 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer {
private function buildClassConstructorParameters(\ReflectionMethod $constructor): array {
return array_map(function (ReflectionParameter $parameter) {
$parameterType = $parameter->getType();
$resolveName = $parameter->getName();
if (!($parameterType instanceof ReflectionNamedType)) {
return $this->get($resolveName);
}
// try to find out if it is a class or a simple parameter
if ($parameterType !== null && ($parameterType instanceof ReflectionNamedType) && !$parameterType->isBuiltin()) {
if (!$parameterType->isBuiltin()) {
$resolveName = $parameterType->getName();
}
try {
$builtIn = $parameterType !== null && ($parameterType instanceof ReflectionNamedType)
&& $parameterType->isBuiltin();
return $this->query($resolveName, !$builtIn);
// Try special variable names like $appName or $user with basic built-in types
if ($parameterType->isBuiltin()) {
if (isset($this->container[$resolveName])) {
return $this->container[$resolveName];
}
throw new QueryException("Could not resolve variable with name " . $resolveName . ' and build-in type ' . $parameterType->getName());
} else {
return $this->get($resolveName);
}
} catch (ContainerExceptionInterface $e) {
// Service not found, use the default value when available
if ($parameter->isDefaultValueAvailable()) {
return $parameter->getDefaultValue();
}
if ($parameterType !== null && ($parameterType instanceof ReflectionNamedType) && !$parameterType->isBuiltin()) {
$resolveName = $parameter->getName();
try {
return $this->query($resolveName);
} catch (ContainerExceptionInterface $e2) {
// Pass null if typed and nullable
if ($parameter->allowsNull() && ($parameterType instanceof ReflectionNamedType)) {
return null;
}
// don't lose the error we got while trying to query by type
throw new QueryException($e->getMessage(), (int)$e->getCode(), $e);
}
if ($parameterType->isBuiltin()) {
throw $e;
}
throw $e;
// Try to get the class from its type
$resolveName = $parameter->getName();
try {
return $this->get($resolveName);
} catch (ContainerExceptionInterface $e2) {
// Pass null if typed and nullable
if ($parameter->allowsNull()) {
return null;
}
// don't lose the error we got while trying to query by type
throw new QueryException($e->getMessage(), (int)$e->getCode(), $e2);
}
}
}, $constructor->getParameters());
}
@ -131,19 +151,15 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer {
}
public function query(string $name, bool $autoload = true) {
if ($autoload) {
return $this->get($name);
}
$name = $this->sanitizeName($name);
if (isset($this->container[$name])) {
return $this->container[$name];
}
if ($autoload) {
$object = $this->resolve($name);
$this->registerService($name, function () use ($object) {
return $object;
});
return $object;
}
throw new QueryNotFoundException('Could not resolve ' . $name . '!');
}
@ -151,7 +167,7 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer {
* @param string $name
* @param mixed $value
*/
public function registerParameter($name, $value) {
public function registerParameter(string $name, mixed $value): void {
$this[$name] = $value;
}
@ -164,7 +180,7 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer {
* @param Closure $closure the closure to be called on service creation
* @param bool $shared
*/
public function registerService($name, Closure $closure, $shared = true) {
public function registerService(string $name, Closure $closure, bool $shared = true): void {
$wrapped = function () use ($closure) {
return $closure($this);
};
@ -186,7 +202,7 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer {
* @param string $alias the alias that should be registered
* @param string $target the target that should be resolved instead
*/
public function registerAlias($alias, $target): void {
public function registerAlias(string $alias, string $target): void {
$this->registerService($alias, function (ContainerInterface $container) use ($target): mixed {
return $container->get($target);
}, false);
@ -207,11 +223,7 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer {
}, false);
}
/**
* @param string $name
* @return string
*/
protected function sanitizeName($name) {
protected function sanitizeName(string $name): string {
if (isset($name[0]) && $name[0] === '\\') {
return ltrim($name, '\\');
}
@ -221,8 +233,8 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer {
/**
* @deprecated 20.0.0 use \Psr\Container\ContainerInterface::has
*/
public function offsetExists($id): bool {
return $this->container->offsetExists($id);
public function offsetExists($offset): bool {
return $this->container->offsetExists($offset);
}
/**
@ -230,8 +242,8 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer {
* @return mixed
*/
#[\ReturnTypeWillChange]
public function offsetGet($id) {
return $this->container->offsetGet($id);
public function offsetGet($offset) {
return $this->container->offsetGet($offset);
}
/**

View file

@ -80,7 +80,7 @@ class Manager implements IManager {
continue;
}
$this->initializedBackends[$backend] = $this->server->query($backend);
$this->initializedBackends[$backend] = $this->server->get($backend);
}
return array_values($this->initializedBackends);

View file

@ -87,7 +87,7 @@ class Manager implements IManager {
* The backend might have services injected that can't be build from the
* server container.
*/
$this->initializedBackends[$backend] = $this->server->query($backend);
$this->initializedBackends[$backend] = $this->server->get($backend);
}
return array_values($this->initializedBackends);

View file

@ -12,6 +12,7 @@ use OCP\AppFramework\QueryException;
use OCP\Collaboration\Resources\IProvider;
use OCP\Collaboration\Resources\IProviderManager;
use OCP\IServerContainer;
use Psr\Container\ContainerExceptionInterface;
use Psr\Log\LoggerInterface;
class ProviderManager implements IProviderManager {
@ -31,8 +32,8 @@ class ProviderManager implements IProviderManager {
if ($this->providers !== []) {
foreach ($this->providers as $provider) {
try {
$this->providerInstances[] = $this->serverContainer->query($provider);
} catch (QueryException $e) {
$this->providerInstances[] = $this->serverContainer->get($provider);
} catch (ContainerExceptionInterface $e) {
$this->logger->error("Could not query resource provider $provider: " . $e->getMessage(), [
'exception' => $e,
]);

View file

@ -24,6 +24,7 @@ use OCP\IDBConnection;
use OCP\Migration\IMigrationStep;
use OCP\Migration\IOutput;
use OCP\Server;
use Psr\Container\ContainerExceptionInterface;
use Psr\Log\LoggerInterface;
class MigrationService {
@ -479,7 +480,8 @@ class MigrationService {
if (!$s instanceof IMigrationStep) {
throw new \InvalidArgumentException('Not a valid migration');
}
} catch (QueryException $e) {
} catch (ContainerExceptionInterface $e) {
echo $e->getTraceAsString() . $e->getMessage() . PHP_EOL;
if (class_exists($class)) {
$s = new $class();
} else {

View file

@ -13,6 +13,7 @@ use OC\AppFramework\Bootstrap\Coordinator;
use OCP\AppFramework\QueryException;
use OCP\AppFramework\Services\InitialStateProvider;
use OCP\IInitialStateService;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
@ -92,8 +93,8 @@ class InitialStateService implements IInitialStateService {
$initialStates = $context->getInitialStates();
foreach ($initialStates as $initialState) {
try {
$provider = $this->container->query($initialState->getService());
} catch (QueryException $e) {
$provider = $this->container->get($initialState->getService());
} catch (ContainerExceptionInterface $e) {
// Log an continue. We can be fault tolerant here.
$this->logger->error('Could not load initial state provider dynamically: ' . $e->getMessage(), [
'exception' => $e,

View file

@ -257,6 +257,7 @@ class Server extends ServerContainer implements IServerContainer {
*/
public function __construct($webRoot, \OC\Config $config) {
parent::__construct();
$this->webRoot = $webRoot;
// To find out if we are running from CLI or not
@ -575,7 +576,7 @@ class Server extends ServerContainer implements IServerContainer {
$this->registerService(IFactory::class, function (Server $c) {
return new \OC\L10N\Factory(
$c->get(\OCP\IConfig::class),
$c->getRequest(),
$c->get(Request::class),
$c->get(IUserSession::class),
$c->get(ICacheFactory::class),
\OC::$SERVERROOT,

View file

@ -12,6 +12,7 @@ use OC\AppFramework\App;
use OC\AppFramework\DependencyInjection\DIContainer;
use OC\AppFramework\Utility\SimpleContainer;
use OCP\AppFramework\QueryException;
use Psr\Container\ContainerExceptionInterface;
use function explode;
use function strtolower;
@ -125,7 +126,7 @@ class ServerContainer extends SimpleContainer {
// Skip server container query for app namespace classes
try {
return parent::query($name, false);
} catch (QueryException $e) {
} catch (ContainerExceptionInterface $e) {
// Continue with general autoloading then
}
// In case the service starts with OCA\ we try to find the service in
@ -133,7 +134,7 @@ class ServerContainer extends SimpleContainer {
if (($appContainer = $this->getAppContainerForService($name)) !== null) {
try {
return $appContainer->queryNoFallback($name);
} catch (QueryException $e) {
} catch (ContainerExceptionInterface $e) {
// Didn't find the service or the respective app container
// In this case the service won't be part of the core container,
// so we can throw directly
@ -145,13 +146,21 @@ class ServerContainer extends SimpleContainer {
try {
$appContainer = $this->getAppContainer(strtolower($segments[1]), $segments[1]);
return $appContainer->queryNoFallback($name);
} catch (QueryException $e) {
} catch (ContainerExceptionInterface $e) {
// Didn't find the service or the respective app container,
// ignore it and fall back to the core container.
}
}
return parent::query($name, $autoload);
if ($autoload) {
return parent::get($name);
} else {
return parent::query($name, false);
}
}
public function get(string $id): mixed {
return $this->query($id);
}
/**

View file

@ -116,13 +116,13 @@ class Streamer {
// prevent absolute dirs
$internalDir = ltrim($internalDir, '/');
$userFolder = \OC::$server->get(IRootFolder::class)->get(Filesystem::getRoot());
$userFolder = \OCP\Server::get(IRootFolder::class)->get(Filesystem::getRoot());
/** @var Folder $dirNode */
$dirNode = $userFolder->get($dir);
$files = $dirNode->getDirectoryListing();
/** @var LoggerInterface $logger */
$logger = \OC::$server->query(LoggerInterface::class);
$logger = \OCP\Server::get(LoggerInterface::class);
foreach ($files as $file) {
if ($file instanceof File) {
try {

View file

@ -18,6 +18,7 @@ use OCP\Support\Subscription\Exception\AlreadyRegisteredException;
use OCP\Support\Subscription\IRegistry;
use OCP\Support\Subscription\ISubscription;
use OCP\Support\Subscription\ISupportedApps;
use Psr\Container\ContainerExceptionInterface;
use Psr\Log\LoggerInterface;
class Registry implements IRegistry {
@ -54,8 +55,8 @@ class Registry implements IRegistry {
private function getSubscription(): ?ISubscription {
if ($this->subscription === null && $this->subscriptionService !== null) {
try {
$this->subscription = $this->container->query($this->subscriptionService);
} catch (QueryException $e) {
$this->subscription = $this->container->get($this->subscriptionService);
} catch (ContainerExceptionInterface) {
// Ignore this
}
}

View file

@ -52,7 +52,7 @@ class App {
if ($runIsSetupDirectly) {
$applicationClassName = get_class($this);
$e = new \RuntimeException('App class ' . $applicationClassName . ' is not setup via query() but directly');
$e = new \RuntimeException('App class ' . $applicationClassName . ' is not setup via get() but directly');
$setUpViaQuery = false;
$classNameParts = explode('\\', trim($applicationClassName, '\\'));
@ -122,8 +122,8 @@ class App {
* parent::__construct('tasks', $params);
*
* $this->getContainer()->registerService('PageController', function(IAppContainer $c){
* $a = $c->query('API');
* $r = $c->query('Request');
* $a = $c->get('API');
* $r = $c->get('Request');
* return new PageController($a, $r);
* });
* }

View file

@ -68,7 +68,7 @@ interface IContainer extends ContainerInterface {
* @since 6.0.0
* @deprecated 20.0.0 use \OCP\AppFramework\Bootstrap\IRegistrationContext::registerParameter
*/
public function registerParameter($name, $value);
public function registerParameter(string $name, mixed $value): void;
/**
* A service is registered in the container where a closure is passed in which will actually
@ -84,7 +84,7 @@ interface IContainer extends ContainerInterface {
* @since 6.0.0
* @deprecated 20.0.0 use \OCP\AppFramework\Bootstrap\IRegistrationContext::registerService
*/
public function registerService($name, Closure $closure, $shared = true);
public function registerService(string $name, Closure $closure, bool $shared = true): void;
/**
* Shortcut for returning a service from a service under a different key,
@ -95,5 +95,5 @@ interface IContainer extends ContainerInterface {
* @since 8.2.0
* @deprecated 20.0.0 use \OCP\AppFramework\Bootstrap\IRegistrationContext::registerServiceAlias
*/
public function registerAlias($alias, $target);
public function registerAlias(string $alias, string $target): void;
}

View file

@ -76,7 +76,7 @@ class CoordinatorTest extends TestCase {
public function testBootAppNotLoadable(): void {
$appId = 'settings';
$this->serverContainer->expects($this->once())
->method('query')
->method('get')
->with(Application::class)
->willThrowException(new QueryException(''));
$this->logger->expects($this->once())
@ -89,7 +89,7 @@ class CoordinatorTest extends TestCase {
$appId = 'settings';
$mockApp = $this->createMock(Application::class);
$this->serverContainer->expects($this->once())
->method('query')
->method('get')
->with(Application::class)
->willReturn($mockApp);
@ -110,7 +110,7 @@ class CoordinatorTest extends TestCase {
}
};
$this->serverContainer->expects($this->once())
->method('query')
->method('get')
->with(Application::class)
->willReturn($mockApp);

View file

@ -19,6 +19,7 @@ use OCP\AppFramework\QueryException;
use OCP\IConfig;
use OCP\IRequestId;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Container\ContainerExceptionInterface;
/**
* @group DB
@ -138,7 +139,7 @@ class DIContainerTest extends \Test\TestCase {
}
public function testInvalidAppClass(): void {
$this->expectException(QueryException::class);
$this->container->query('\OCA\Name\Foo');
$this->expectException(ContainerExceptionInterface::class);
$this->container->get('\OCA\Name\Foo');
}
}

View file

@ -54,12 +54,12 @@ class DIIntergrationTests extends TestCase {
$this->server->registerService(ClassB::class, function (SimpleContainer $c) {
return new ClassB(
$c->query(Interface1::class)
$c->get(Interface1::class)
);
});
/** @var ClassB $res */
$res = $this->container->query(ClassB::class);
$res = $this->container->get(ClassB::class);
$this->assertSame(ClassA1::class, get_class($res->interface1));
}
@ -70,12 +70,12 @@ class DIIntergrationTests extends TestCase {
$this->container->registerService(ClassB::class, function (SimpleContainer $c) {
return new ClassB(
$c->query(Interface1::class)
$c->get(Interface1::class)
);
});
/** @var ClassB $res */
$res = $this->container->query(ClassB::class);
$res = $this->container->get(ClassB::class);
$this->assertSame(ClassA1::class, get_class($res->interface1));
}
@ -90,12 +90,12 @@ class DIIntergrationTests extends TestCase {
$this->container->registerService(ClassB::class, function (SimpleContainer $c) {
return new ClassB(
$c->query(Interface1::class)
$c->get(Interface1::class)
);
});
/** @var ClassB $res */
$res = $this->container->query(ClassB::class);
$res = $this->container->get(ClassB::class);
$this->assertSame(ClassA2::class, get_class($res->interface1));
}
@ -110,12 +110,12 @@ class DIIntergrationTests extends TestCase {
$this->server->registerService(ClassB::class, function (SimpleContainer $c) {
return new ClassB(
$c->query(Interface1::class)
$c->get(Interface1::class)
);
});
/** @var ClassB $res */
$res = $this->container->query(ClassB::class);
$res = $this->container->get(ClassB::class);
$this->assertSame(ClassA1::class, get_class($res->interface1));
}
}

View file

@ -12,6 +12,8 @@ namespace Test\AppFramework\Utility;
use OC\AppFramework\Utility\SimpleContainer;
use OCP\AppFramework\QueryException;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
interface TestInterface {
@ -66,75 +68,66 @@ class SimpleContainerTest extends \Test\TestCase {
$this->container = new SimpleContainer();
}
public function testRegister(): void {
$this->container->registerParameter('test', 'abc');
$this->assertEquals('abc', $this->container->query('test'));
$this->assertEquals('abc', $this->container->get('test'));
}
/**
* Test querying a class that is not registered without autoload enabled
*/
public function testNothingRegistered(): void {
try {
$this->container->query('something really hard', false);
$this->container->get('something really hard', false);
$this->fail('Expected `QueryException` exception was not thrown');
} catch (\Throwable $exception) {
$this->assertInstanceOf(QueryException::class, $exception);
$this->assertInstanceOf(ContainerExceptionInterface::class, $exception);
$this->assertInstanceOf(NotFoundExceptionInterface::class, $exception);
}
}
/**
* Test querying a class that is not registered with autoload enabled
*/
public function testNothingRegistered_autoload(): void {
try {
$this->container->query('something really hard');
$this->container->get('something really hard');
$this->fail('Expected `QueryException` exception was not thrown');
} catch (\Throwable $exception) {
$this->assertInstanceOf(QueryException::class, $exception);
$this->assertInstanceOf(ContainerExceptionInterface::class, $exception);
$this->assertInstanceOf(NotFoundExceptionInterface::class, $exception);
}
}
public function testNotAClass(): void {
$this->expectException(QueryException::class);
$this->expectException(ContainerExceptionInterface::class);
$this->container->query('Test\AppFramework\Utility\TestInterface');
$this->container->get('Test\AppFramework\Utility\TestInterface');
}
public function testNoConstructorClass(): void {
$object = $this->container->query('Test\AppFramework\Utility\ClassEmptyConstructor');
$object = $this->container->get('Test\AppFramework\Utility\ClassEmptyConstructor');
$this->assertTrue($object instanceof ClassEmptyConstructor);
}
public function testInstancesOnlyOnce(): void {
$object = $this->container->query('Test\AppFramework\Utility\ClassEmptyConstructor');
$object2 = $this->container->query('Test\AppFramework\Utility\ClassEmptyConstructor');
$object = $this->container->get('Test\AppFramework\Utility\ClassEmptyConstructor');
$object2 = $this->container->get('Test\AppFramework\Utility\ClassEmptyConstructor');
$this->assertSame($object, $object2);
}
public function testConstructorSimple(): void {
$this->container->registerParameter('test', 'abc');
$object = $this->container->query(
$object = $this->container->get(
'Test\AppFramework\Utility\ClassSimpleConstructor'
);
$this->assertTrue($object instanceof ClassSimpleConstructor);
$this->assertEquals('abc', $object->test);
}
public function testConstructorComplex(): void {
$this->container->registerParameter('test', 'abc');
$object = $this->container->query(
$object = $this->container->get(
'Test\AppFramework\Utility\ClassComplexConstructor'
);
$this->assertTrue($object instanceof ClassComplexConstructor);
@ -142,14 +135,13 @@ class SimpleContainerTest extends \Test\TestCase {
$this->assertEquals('abc', $object->test);
}
public function testConstructorComplexInterface(): void {
$this->container->registerParameter('test', 'abc');
$this->container->registerService(
'Test\AppFramework\Utility\IInterfaceConstructor', function ($c) {
return $c->query('Test\AppFramework\Utility\ClassSimpleConstructor');
'Test\AppFramework\Utility\IInterfaceConstructor', function (ContainerInterface $c) {
return $c->get('Test\AppFramework\Utility\ClassSimpleConstructor');
});
$object = $this->container->query(
$object = $this->container->get(
'Test\AppFramework\Utility\ClassInterfaceConstructor'
);
$this->assertTrue($object instanceof ClassInterfaceConstructor);
@ -157,17 +149,16 @@ class SimpleContainerTest extends \Test\TestCase {
$this->assertEquals('abc', $object->test);
}
public function testOverrideService(): void {
$this->container->registerService(
'Test\AppFramework\Utility\IInterfaceConstructor', function ($c) {
return $c->query('Test\AppFramework\Utility\ClassSimpleConstructor');
'Test\AppFramework\Utility\IInterfaceConstructor', function (ContainerInterface $c) {
return $c->get('Test\AppFramework\Utility\ClassSimpleConstructor');
});
$this->container->registerService(
'Test\AppFramework\Utility\IInterfaceConstructor', function ($c) {
return $c->query('Test\AppFramework\Utility\ClassEmptyConstructor');
'Test\AppFramework\Utility\IInterfaceConstructor', function (ContainerInterface $c) {
return $c->get('Test\AppFramework\Utility\ClassEmptyConstructor');
});
$object = $this->container->query(
$object = $this->container->get(
'Test\AppFramework\Utility\IInterfaceConstructor'
);
$this->assertTrue($object instanceof ClassEmptyConstructor);
@ -176,7 +167,7 @@ class SimpleContainerTest extends \Test\TestCase {
public function testRegisterAliasParamter(): void {
$this->container->registerParameter('test', 'abc');
$this->container->registerAlias('test1', 'test');
$this->assertEquals('abc', $this->container->query('test1'));
$this->assertEquals('abc', $this->container->get('test1'));
}
public function testRegisterAliasService(): void {
@ -185,11 +176,11 @@ class SimpleContainerTest extends \Test\TestCase {
}, true);
$this->container->registerAlias('test1', 'test');
$this->assertSame(
$this->container->query('test'), $this->container->query('test'));
$this->container->get('test'), $this->container->get('test'));
$this->assertSame(
$this->container->query('test1'), $this->container->query('test1'));
$this->container->get('test1'), $this->container->get('test1'));
$this->assertSame(
$this->container->query('test'), $this->container->query('test1'));
$this->container->get('test'), $this->container->get('test1'));
}
public static function sanitizeNameProvider(): array {
@ -206,14 +197,14 @@ class SimpleContainerTest extends \Test\TestCase {
$this->container->registerService($register, function () {
return 'abc';
});
$this->assertEquals('abc', $this->container->query($query));
$this->assertEquals('abc', $this->container->get($query));
}
public function testConstructorComplexNoTestParameterFound(): void {
$this->expectException(QueryException::class);
$this->expectException(ContainerExceptionInterface::class);
$object = $this->container->query(
$object = $this->container->get(
'Test\AppFramework\Utility\ClassComplexConstructor'
);
/* Use the object to trigger DI on PHP >= 8.4 */
@ -225,7 +216,7 @@ class SimpleContainerTest extends \Test\TestCase {
return new \StdClass();
}, false);
$this->assertNotSame(
$this->container->query('test'), $this->container->query('test'));
$this->container->get('test'), $this->container->get('test'));
}
public function testRegisterAliasFactory(): void {
@ -234,17 +225,17 @@ class SimpleContainerTest extends \Test\TestCase {
}, false);
$this->container->registerAlias('test1', 'test');
$this->assertNotSame(
$this->container->query('test'), $this->container->query('test'));
$this->container->get('test'), $this->container->get('test'));
$this->assertNotSame(
$this->container->query('test1'), $this->container->query('test1'));
$this->container->get('test1'), $this->container->get('test1'));
$this->assertNotSame(
$this->container->query('test'), $this->container->query('test1'));
$this->container->get('test'), $this->container->get('test1'));
}
public function testQueryUntypedNullable(): void {
$this->expectException(QueryException::class);
$this->expectException(ContainerExceptionInterface::class);
$object = $this->container->query(
$object = $this->container->get(
ClassNullableUntypedConstructorArg::class
);
/* Use the object to trigger DI on PHP >= 8.4 */
@ -253,7 +244,7 @@ class SimpleContainerTest extends \Test\TestCase {
public function testQueryTypedNullable(): void {
/** @var ClassNullableTypedConstructorArg $service */
$service = $this->container->query(ClassNullableTypedConstructorArg::class);
$service = $this->container->get(ClassNullableTypedConstructorArg::class);
self::assertNull($service->class);
}

View file

@ -20,17 +20,13 @@ use PHPUnit\Framework\MockObject\MockObject;
use Test\TestCase;
class ManagerTest extends TestCase {
/** @var Coordinator|MockObject */
private $coordinator;
private Coordinator&MockObject $coordinator;
/** @var IServerContainer|MockObject */
private $server;
private IServerContainer&MockObject $server;
/** @var ResourcesRoomsUpdater|MockObject */
private $resourcesRoomsUpdater;
private ResourcesRoomsUpdater&MockObject $resourcesRoomsUpdater;
/** @var Manager */
private $manager;
private Manager $manager;
protected function setUp(): void {
parent::setUp();
@ -52,10 +48,10 @@ class ManagerTest extends TestCase {
$backend2 = $this->createMock(IBackend::class);
$backend2->method('getBackendIdentifier')->willReturn('backend_2');
$this->server->expects(self::exactly(2))
->method('query')
->method('get')
->willReturnMap([
['calendar_resource_backend1', true, $backend1,],
['calendar_resource_backend2', true, $backend2,],
['calendar_resource_backend1', $backend1,],
['calendar_resource_backend2', $backend2,],
]);
$this->manager->registerBackend('calendar_resource_backend1');
@ -84,7 +80,7 @@ class ManagerTest extends TestCase {
new ServiceRegistration('calendar_resource_foo', $backendClass)
]);
$this->server->expects(self::once())
->method('query')
->method('get')
->with($backendClass)
->willReturn($backend);
@ -97,10 +93,10 @@ class ManagerTest extends TestCase {
$backend2 = $this->createMock(IBackend::class);
$backend2->method('getBackendIdentifier')->willReturn('backend_2');
$this->server->expects(self::exactly(2))
->method('query')
->method('get')
->willReturnMap([
['calendar_resource_backend1', true, $backend1,],
['calendar_resource_backend2', true, $backend2,],
['calendar_resource_backend1', $backend1,],
['calendar_resource_backend2', $backend2,],
]);
$this->manager->registerBackend('calendar_resource_backend1');
@ -116,10 +112,10 @@ class ManagerTest extends TestCase {
$backend2 = $this->createMock(IBackend::class);
$backend2->method('getBackendIdentifier')->willReturn('backend_2');
$this->server->expects(self::exactly(2))
->method('query')
->method('get')
->willReturnMap([
['calendar_resource_backend1', true, $backend1,],
['calendar_resource_backend2', true, $backend2,],
['calendar_resource_backend1', $backend1,],
['calendar_resource_backend2', $backend2,],
]);
$this->manager->registerBackend('calendar_resource_backend1');

View file

@ -52,10 +52,10 @@ class ManagerTest extends TestCase {
$backend2 = $this->createMock(IBackend::class);
$backend2->method('getBackendIdentifier')->willReturn('backend_2');
$this->server->expects(self::exactly(2))
->method('query')
->method('get')
->willReturnMap([
['calendar_room_backend1', true, $backend1,],
['calendar_room_backend2', true, $backend2,],
['calendar_room_backend1', $backend1,],
['calendar_room_backend2', $backend2,],
]);
$this->manager->registerBackend('calendar_room_backend1');
@ -86,7 +86,7 @@ class ManagerTest extends TestCase {
new ServiceRegistration('calendar_room_foo', $backendClass)
]);
$this->server->expects(self::once())
->method('query')
->method('get')
->with($backendClass)
->willReturn($backend);
@ -99,10 +99,10 @@ class ManagerTest extends TestCase {
$backend2 = $this->createMock(IBackend::class);
$backend2->method('getBackendIdentifier')->willReturn('backend_2');
$this->server->expects(self::exactly(2))
->method('query')
->method('get')
->willReturnMap([
['calendar_room_backend1', true, $backend1,],
['calendar_room_backend2', true, $backend2,],
['calendar_room_backend1', $backend1,],
['calendar_room_backend2', $backend2,],
]);
$this->manager->registerBackend('calendar_room_backend1');
@ -118,7 +118,7 @@ class ManagerTest extends TestCase {
$backend2 = $this->createMock(IBackend::class);
$backend2->method('getBackendIdentifier')->willReturn('backend_2');
$this->server->expects(self::exactly(2))
->method('query')
->method('get')
->willReturnMap([
['calendar_room_backend1', true, $backend1,],
['calendar_room_backend2', true, $backend2,],

View file

@ -13,16 +13,14 @@ use OCA\Files\Collaboration\Resources\ResourceProvider;
use OCP\AppFramework\QueryException;
use OCP\Collaboration\Resources\IProviderManager;
use OCP\IServerContainer;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Test\TestCase;
class ProviderManagerTest extends TestCase {
/** @var IServerContainer */
protected $serverContainer;
/** @var LoggerInterface */
protected $logger;
/** @var IProviderManager */
protected $providerManager;
protected IServerContainer&MockObject $serverContainer;
protected LoggerInterface&MockObject $logger;
protected IProviderManager $providerManager;
protected function setUp(): void {
parent::setUp();
@ -48,7 +46,7 @@ class ProviderManagerTest extends TestCase {
public function testGetResourceProvidersValidProvider(): void {
$this->serverContainer->expects($this->once())
->method('query')
->method('get')
->with($this->equalTo(ResourceProvider::class))
->willReturn($this->createMock(ResourceProvider::class));
@ -61,7 +59,7 @@ class ProviderManagerTest extends TestCase {
public function testGetResourceProvidersInvalidProvider(): void {
$this->serverContainer->expects($this->once())
->method('query')
->method('get')
->with($this->equalTo('InvalidResourceProvider'))
->willThrowException(new QueryException('A meaningful error message'));
@ -76,7 +74,7 @@ class ProviderManagerTest extends TestCase {
public function testGetResourceProvidersValidAndInvalidProvider(): void {
$this->serverContainer->expects($this->exactly(2))
->method('query')
->method('get')
->willReturnCallback(function (string $service) {
if ($service === 'InvalidResourceProvider') {
throw new QueryException('A meaningful error message');

View file

@ -12,6 +12,7 @@ use OC\App\AppStore\Fetcher\AppFetcher;
use OC\Config;
use OC\Server;
use OCP\Comments\ICommentsManager;
use OCP\IConfig;
/**
* Class Server
@ -43,14 +44,9 @@ class ServerTest extends \Test\TestCase {
];
}
/**
*
* @param string $serviceName
* @param string $instanceOf
*/
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestQuery')]
public function testQuery($serviceName, $instanceOf): void {
$this->assertInstanceOf($instanceOf, $this->server->query($serviceName), 'Service "' . $serviceName . '"" did not return the right class');
public function testQuery(string $serviceName, string $instanceOf): void {
$this->assertInstanceOf($instanceOf, $this->server->get($serviceName), 'Service "' . $serviceName . '"" did not return the right class');
}
public function testGetCertificateManager(): void {
@ -59,7 +55,7 @@ class ServerTest extends \Test\TestCase {
}
public function testOverwriteDefaultCommentsManager(): void {
$config = $this->server->getConfig();
$config = $this->server->get(IConfig::class);
$defaultManagerFactory = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory');
$config->setSystemValue('comments.managerFactory', '\Test\Comments\FakeFactory');

View file

@ -119,7 +119,7 @@ class RegistryTest extends TestCase {
}
public function testSubscriptionService(): void {
$this->serverContainer->method('query')
$this->serverContainer->method('get')
->with(DummySubscription::class)
->willReturn(new DummySubscription(true, false, false));
$this->registry->registerService(DummySubscription::class);

View file

@ -75,11 +75,11 @@ trait EncryptionTrait {
$container = $this->encryptionApp->getContainer();
/** @var KeyManager $keyManager */
$keyManager = $container->query(KeyManager::class);
$keyManager = $container->get(KeyManager::class);
/** @var Setup $userSetup */
$userSetup = $container->query(Setup::class);
$userSetup = $container->get(Setup::class);
$userSetup->setupUser($name, $password);
$encryptionManager = $container->query(IManager::class);
$encryptionManager = $container->get(IManager::class);
$this->encryptionApp->setUp($encryptionManager);
$keyManager->init($name, $password);
$this->invokePrivate($keyManager, 'keyUid', [$name]);