Completed
Push — master ( 158b3e...c62fa5 )
by Joas
29:53 queued 14s
created
lib/private/Support/CrashReport/Registry.php 2 patches
Indentation   +107 added lines, -107 removed lines patch added patch discarded remove patch
@@ -20,117 +20,117 @@
 block discarded – undo
20 20
 use function array_shift;
21 21
 
22 22
 class Registry implements IRegistry {
23
-	/** @var string[] */
24
-	private $lazyReporters = [];
25
-
26
-	/** @var IReporter[] */
27
-	private $reporters = [];
28
-
29
-	/** @var IServerContainer */
30
-	private $serverContainer;
31
-
32
-	public function __construct(IServerContainer $serverContainer) {
33
-		$this->serverContainer = $serverContainer;
34
-	}
35
-
36
-	/**
37
-	 * Register a reporter instance
38
-	 *
39
-	 * @param IReporter $reporter
40
-	 */
41
-	public function register(IReporter $reporter): void {
42
-		$this->reporters[] = $reporter;
43
-	}
44
-
45
-	public function registerLazy(string $class): void {
46
-		$this->lazyReporters[] = $class;
47
-	}
48
-
49
-	/**
50
-	 * Delegate breadcrumb collection to all registered reporters
51
-	 *
52
-	 * @param string $message
53
-	 * @param string $category
54
-	 * @param array $context
55
-	 *
56
-	 * @since 15.0.0
57
-	 */
58
-	public function delegateBreadcrumb(string $message, string $category, array $context = []): void {
59
-		$this->loadLazyProviders();
60
-
61
-		foreach ($this->reporters as $reporter) {
62
-			if ($reporter instanceof ICollectBreadcrumbs) {
63
-				$reporter->collect($message, $category, $context);
64
-			}
65
-		}
66
-	}
67
-
68
-	/**
69
-	 * Delegate crash reporting to all registered reporters
70
-	 *
71
-	 * @param Exception|Throwable $exception
72
-	 * @param array $context
73
-	 */
74
-	public function delegateReport($exception, array $context = []): void {
75
-		$this->loadLazyProviders();
76
-
77
-		foreach ($this->reporters as $reporter) {
78
-			$reporter->report($exception, $context);
79
-		}
80
-	}
81
-
82
-	/**
83
-	 * Delegate a message to all reporters that implement IMessageReporter
84
-	 *
85
-	 * @param string $message
86
-	 * @param array $context
87
-	 *
88
-	 * @return void
89
-	 */
90
-	public function delegateMessage(string $message, array $context = []): void {
91
-		$this->loadLazyProviders();
92
-
93
-		foreach ($this->reporters as $reporter) {
94
-			if ($reporter instanceof IMessageReporter) {
95
-				$reporter->reportMessage($message, $context);
96
-			}
97
-		}
98
-	}
99
-
100
-	private function loadLazyProviders(): void {
101
-		while (($class = array_shift($this->lazyReporters)) !== null) {
102
-			try {
103
-				/** @var IReporter $reporter */
104
-				$reporter = $this->serverContainer->query($class);
105
-			} catch (QueryException $e) {
106
-				/*
23
+    /** @var string[] */
24
+    private $lazyReporters = [];
25
+
26
+    /** @var IReporter[] */
27
+    private $reporters = [];
28
+
29
+    /** @var IServerContainer */
30
+    private $serverContainer;
31
+
32
+    public function __construct(IServerContainer $serverContainer) {
33
+        $this->serverContainer = $serverContainer;
34
+    }
35
+
36
+    /**
37
+     * Register a reporter instance
38
+     *
39
+     * @param IReporter $reporter
40
+     */
41
+    public function register(IReporter $reporter): void {
42
+        $this->reporters[] = $reporter;
43
+    }
44
+
45
+    public function registerLazy(string $class): void {
46
+        $this->lazyReporters[] = $class;
47
+    }
48
+
49
+    /**
50
+     * Delegate breadcrumb collection to all registered reporters
51
+     *
52
+     * @param string $message
53
+     * @param string $category
54
+     * @param array $context
55
+     *
56
+     * @since 15.0.0
57
+     */
58
+    public function delegateBreadcrumb(string $message, string $category, array $context = []): void {
59
+        $this->loadLazyProviders();
60
+
61
+        foreach ($this->reporters as $reporter) {
62
+            if ($reporter instanceof ICollectBreadcrumbs) {
63
+                $reporter->collect($message, $category, $context);
64
+            }
65
+        }
66
+    }
67
+
68
+    /**
69
+     * Delegate crash reporting to all registered reporters
70
+     *
71
+     * @param Exception|Throwable $exception
72
+     * @param array $context
73
+     */
74
+    public function delegateReport($exception, array $context = []): void {
75
+        $this->loadLazyProviders();
76
+
77
+        foreach ($this->reporters as $reporter) {
78
+            $reporter->report($exception, $context);
79
+        }
80
+    }
81
+
82
+    /**
83
+     * Delegate a message to all reporters that implement IMessageReporter
84
+     *
85
+     * @param string $message
86
+     * @param array $context
87
+     *
88
+     * @return void
89
+     */
90
+    public function delegateMessage(string $message, array $context = []): void {
91
+        $this->loadLazyProviders();
92
+
93
+        foreach ($this->reporters as $reporter) {
94
+            if ($reporter instanceof IMessageReporter) {
95
+                $reporter->reportMessage($message, $context);
96
+            }
97
+        }
98
+    }
99
+
100
+    private function loadLazyProviders(): void {
101
+        while (($class = array_shift($this->lazyReporters)) !== null) {
102
+            try {
103
+                /** @var IReporter $reporter */
104
+                $reporter = $this->serverContainer->query($class);
105
+            } catch (QueryException $e) {
106
+                /*
107 107
 				 * There is a circular dependency between the logger and the registry, so
108 108
 				 * we can not inject it. Thus the static call.
109 109
 				 */
110
-				\OC::$server->get(LoggerInterface::class)->critical('Could not load lazy crash reporter: ' . $e->getMessage(), [
111
-					'exception' => $e,
112
-				]);
113
-				return;
114
-			}
115
-			/**
116
-			 * Try to register the loaded reporter. Theoretically it could be of a wrong
117
-			 * type, so we might get a TypeError here that we should catch.
118
-			 */
119
-			try {
120
-				$this->register($reporter);
121
-			} catch (Throwable $e) {
122
-				/*
110
+                \OC::$server->get(LoggerInterface::class)->critical('Could not load lazy crash reporter: ' . $e->getMessage(), [
111
+                    'exception' => $e,
112
+                ]);
113
+                return;
114
+            }
115
+            /**
116
+             * Try to register the loaded reporter. Theoretically it could be of a wrong
117
+             * type, so we might get a TypeError here that we should catch.
118
+             */
119
+            try {
120
+                $this->register($reporter);
121
+            } catch (Throwable $e) {
122
+                /*
123 123
 				 * There is a circular dependency between the logger and the registry, so
124 124
 				 * we can not inject it. Thus the static call.
125 125
 				 */
126
-				\OC::$server->get(LoggerInterface::class)->critical('Could not register lazy crash reporter: ' . $e->getMessage(), [
127
-					'exception' => $e,
128
-				]);
129
-			}
130
-		}
131
-	}
132
-
133
-	public function hasReporters(): bool {
134
-		return !empty($this->lazyReporters) || !empty($this->reporters);
135
-	}
126
+                \OC::$server->get(LoggerInterface::class)->critical('Could not register lazy crash reporter: ' . $e->getMessage(), [
127
+                    'exception' => $e,
128
+                ]);
129
+            }
130
+        }
131
+    }
132
+
133
+    public function hasReporters(): bool {
134
+        return !empty($this->lazyReporters) || !empty($this->reporters);
135
+    }
136 136
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -107,7 +107,7 @@  discard block
 block discarded – undo
107 107
 				 * There is a circular dependency between the logger and the registry, so
108 108
 				 * we can not inject it. Thus the static call.
109 109
 				 */
110
-				\OC::$server->get(LoggerInterface::class)->critical('Could not load lazy crash reporter: ' . $e->getMessage(), [
110
+				\OC::$server->get(LoggerInterface::class)->critical('Could not load lazy crash reporter: '.$e->getMessage(), [
111 111
 					'exception' => $e,
112 112
 				]);
113 113
 				return;
@@ -123,7 +123,7 @@  discard block
 block discarded – undo
123 123
 				 * There is a circular dependency between the logger and the registry, so
124 124
 				 * we can not inject it. Thus the static call.
125 125
 				 */
126
-				\OC::$server->get(LoggerInterface::class)->critical('Could not register lazy crash reporter: ' . $e->getMessage(), [
126
+				\OC::$server->get(LoggerInterface::class)->critical('Could not register lazy crash reporter: '.$e->getMessage(), [
127 127
 					'exception' => $e,
128 128
 				]);
129 129
 			}
Please login to merge, or discard this patch.
apps/webhook_listeners/tests/Db/WebhookListenerMapperTest.php 1 patch
Indentation   +149 added lines, -149 removed lines patch added patch discarded remove patch
@@ -22,153 +22,153 @@
 block discarded – undo
22 22
  * @group DB
23 23
  */
24 24
 class WebhookListenerMapperTest extends TestCase {
25
-	private IDBConnection $connection;
26
-	private WebhookListenerMapper $mapper;
27
-	private ICacheFactory $cacheFactory;
28
-
29
-	protected function setUp(): void {
30
-		parent::setUp();
31
-
32
-		$this->connection = Server::get(IDBConnection::class);
33
-		$this->cacheFactory = Server::get(ICacheFactory::class);
34
-		$this->pruneTables();
35
-
36
-		$this->mapper = new WebhookListenerMapper(
37
-			$this->connection,
38
-			$this->cacheFactory,
39
-		);
40
-	}
41
-
42
-	protected function tearDown(): void {
43
-		$this->pruneTables();
44
-		parent::tearDown();
45
-	}
46
-
47
-	protected function pruneTables(): void {
48
-		$query = $this->connection->getQueryBuilder();
49
-		$query->delete(WebhookListenerMapper::TABLE_NAME)->executeStatement();
50
-	}
51
-
52
-	public function testInsertListenerWithNotSupportedEvent(): void {
53
-		$this->expectException(\UnexpectedValueException::class);
54
-		$listener1 = $this->mapper->addWebhookListener(
55
-			null,
56
-			'bob',
57
-			'POST',
58
-			'https://webhook.example.com/endpoint',
59
-			UserCreatedEvent::class,
60
-			null,
61
-			null,
62
-			null,
63
-			AuthMethod::None,
64
-			null,
65
-		);
66
-	}
67
-
68
-	public function testInsertListenerAndGetIt(): void {
69
-		$listener1 = $this->mapper->addWebhookListener(
70
-			null,
71
-			'bob',
72
-			'POST',
73
-			'https://webhook.example.com/endpoint',
74
-			NodeWrittenEvent::class,
75
-			null,
76
-			null,
77
-			null,
78
-			AuthMethod::None,
79
-			null,
80
-		);
81
-
82
-		$listener2 = $this->mapper->getById($listener1->getId());
83
-
84
-		$listener1->resetUpdatedFields();
85
-		$this->assertEquals($listener1, $listener2);
86
-	}
87
-
88
-	public function testInsertListenerAndGetItByUri(): void {
89
-		$uri = 'https://webhook.example.com/endpoint';
90
-		$listener1 = $this->mapper->addWebhookListener(
91
-			null,
92
-			'bob',
93
-			'POST',
94
-			$uri,
95
-			NodeWrittenEvent::class,
96
-			null,
97
-			null,
98
-			null,
99
-			AuthMethod::None,
100
-			null,
101
-		);
102
-
103
-		$listeners = $this->mapper->getByUri($uri);
104
-
105
-		$listener1->resetUpdatedFields();
106
-		$this->assertContains($listener1->getId(), array_map(fn ($listener) => $listener->getId(), $listeners));
107
-	}
108
-
109
-	public function testInsertListenerAndGetItWithAuthData(): void {
110
-		$listener1 = $this->mapper->addWebhookListener(
111
-			null,
112
-			'bob',
113
-			'POST',
114
-			'https://webhook.example.com/endpoint',
115
-			NodeWrittenEvent::class,
116
-			null,
117
-			null,
118
-			null,
119
-			AuthMethod::Header,
120
-			['secretHeader' => 'header'],
121
-		);
122
-
123
-		$listener2 = $this->mapper->getById($listener1->getId());
124
-
125
-		$listener1->resetUpdatedFields();
126
-		$this->assertEquals($listener1, $listener2);
127
-	}
128
-
129
-	public function testInsertListenerAndGetItByEventAndUser(): void {
130
-		$listener1 = $this->mapper->addWebhookListener(
131
-			null,
132
-			'bob',
133
-			'POST',
134
-			'https://webhook.example.com/endpoint',
135
-			NodeWrittenEvent::class,
136
-			null,
137
-			'alice',
138
-			null,
139
-			AuthMethod::None,
140
-			null,
141
-		);
142
-		$listener1->resetUpdatedFields();
143
-
144
-		$this->assertEquals([NodeWrittenEvent::class], $this->mapper->getAllConfiguredEvents('alice'));
145
-		$this->assertEquals([], $this->mapper->getAllConfiguredEvents(''));
146
-		$this->assertEquals([], $this->mapper->getAllConfiguredEvents('otherUser'));
147
-
148
-		$this->assertEquals([$listener1], $this->mapper->getByEvent(NodeWrittenEvent::class, 'alice'));
149
-		$this->assertEquals([], $this->mapper->getByEvent(NodeWrittenEvent::class, ''));
150
-		$this->assertEquals([], $this->mapper->getByEvent(NodeWrittenEvent::class, 'otherUser'));
151
-
152
-		/* Add a second listener with no user filter */
153
-		$listener2 = $this->mapper->addWebhookListener(
154
-			null,
155
-			'bob',
156
-			'POST',
157
-			'https://webhook.example.com/endpoint',
158
-			NodeWrittenEvent::class,
159
-			null,
160
-			'',
161
-			null,
162
-			AuthMethod::None,
163
-			null,
164
-		);
165
-		$listener2->resetUpdatedFields();
166
-
167
-		$this->assertEquals([NodeWrittenEvent::class], $this->mapper->getAllConfiguredEvents('alice'));
168
-		$this->assertEquals([NodeWrittenEvent::class], $this->mapper->getAllConfiguredEvents(''));
169
-
170
-		$this->assertEquals([$listener1, $listener2], $this->mapper->getByEvent(NodeWrittenEvent::class, 'alice'));
171
-		$this->assertEquals([$listener2], $this->mapper->getByEvent(NodeWrittenEvent::class, 'otherUser'));
172
-		$this->assertEquals([$listener2], $this->mapper->getByEvent(NodeWrittenEvent::class));
173
-	}
25
+    private IDBConnection $connection;
26
+    private WebhookListenerMapper $mapper;
27
+    private ICacheFactory $cacheFactory;
28
+
29
+    protected function setUp(): void {
30
+        parent::setUp();
31
+
32
+        $this->connection = Server::get(IDBConnection::class);
33
+        $this->cacheFactory = Server::get(ICacheFactory::class);
34
+        $this->pruneTables();
35
+
36
+        $this->mapper = new WebhookListenerMapper(
37
+            $this->connection,
38
+            $this->cacheFactory,
39
+        );
40
+    }
41
+
42
+    protected function tearDown(): void {
43
+        $this->pruneTables();
44
+        parent::tearDown();
45
+    }
46
+
47
+    protected function pruneTables(): void {
48
+        $query = $this->connection->getQueryBuilder();
49
+        $query->delete(WebhookListenerMapper::TABLE_NAME)->executeStatement();
50
+    }
51
+
52
+    public function testInsertListenerWithNotSupportedEvent(): void {
53
+        $this->expectException(\UnexpectedValueException::class);
54
+        $listener1 = $this->mapper->addWebhookListener(
55
+            null,
56
+            'bob',
57
+            'POST',
58
+            'https://webhook.example.com/endpoint',
59
+            UserCreatedEvent::class,
60
+            null,
61
+            null,
62
+            null,
63
+            AuthMethod::None,
64
+            null,
65
+        );
66
+    }
67
+
68
+    public function testInsertListenerAndGetIt(): void {
69
+        $listener1 = $this->mapper->addWebhookListener(
70
+            null,
71
+            'bob',
72
+            'POST',
73
+            'https://webhook.example.com/endpoint',
74
+            NodeWrittenEvent::class,
75
+            null,
76
+            null,
77
+            null,
78
+            AuthMethod::None,
79
+            null,
80
+        );
81
+
82
+        $listener2 = $this->mapper->getById($listener1->getId());
83
+
84
+        $listener1->resetUpdatedFields();
85
+        $this->assertEquals($listener1, $listener2);
86
+    }
87
+
88
+    public function testInsertListenerAndGetItByUri(): void {
89
+        $uri = 'https://webhook.example.com/endpoint';
90
+        $listener1 = $this->mapper->addWebhookListener(
91
+            null,
92
+            'bob',
93
+            'POST',
94
+            $uri,
95
+            NodeWrittenEvent::class,
96
+            null,
97
+            null,
98
+            null,
99
+            AuthMethod::None,
100
+            null,
101
+        );
102
+
103
+        $listeners = $this->mapper->getByUri($uri);
104
+
105
+        $listener1->resetUpdatedFields();
106
+        $this->assertContains($listener1->getId(), array_map(fn ($listener) => $listener->getId(), $listeners));
107
+    }
108
+
109
+    public function testInsertListenerAndGetItWithAuthData(): void {
110
+        $listener1 = $this->mapper->addWebhookListener(
111
+            null,
112
+            'bob',
113
+            'POST',
114
+            'https://webhook.example.com/endpoint',
115
+            NodeWrittenEvent::class,
116
+            null,
117
+            null,
118
+            null,
119
+            AuthMethod::Header,
120
+            ['secretHeader' => 'header'],
121
+        );
122
+
123
+        $listener2 = $this->mapper->getById($listener1->getId());
124
+
125
+        $listener1->resetUpdatedFields();
126
+        $this->assertEquals($listener1, $listener2);
127
+    }
128
+
129
+    public function testInsertListenerAndGetItByEventAndUser(): void {
130
+        $listener1 = $this->mapper->addWebhookListener(
131
+            null,
132
+            'bob',
133
+            'POST',
134
+            'https://webhook.example.com/endpoint',
135
+            NodeWrittenEvent::class,
136
+            null,
137
+            'alice',
138
+            null,
139
+            AuthMethod::None,
140
+            null,
141
+        );
142
+        $listener1->resetUpdatedFields();
143
+
144
+        $this->assertEquals([NodeWrittenEvent::class], $this->mapper->getAllConfiguredEvents('alice'));
145
+        $this->assertEquals([], $this->mapper->getAllConfiguredEvents(''));
146
+        $this->assertEquals([], $this->mapper->getAllConfiguredEvents('otherUser'));
147
+
148
+        $this->assertEquals([$listener1], $this->mapper->getByEvent(NodeWrittenEvent::class, 'alice'));
149
+        $this->assertEquals([], $this->mapper->getByEvent(NodeWrittenEvent::class, ''));
150
+        $this->assertEquals([], $this->mapper->getByEvent(NodeWrittenEvent::class, 'otherUser'));
151
+
152
+        /* Add a second listener with no user filter */
153
+        $listener2 = $this->mapper->addWebhookListener(
154
+            null,
155
+            'bob',
156
+            'POST',
157
+            'https://webhook.example.com/endpoint',
158
+            NodeWrittenEvent::class,
159
+            null,
160
+            '',
161
+            null,
162
+            AuthMethod::None,
163
+            null,
164
+        );
165
+        $listener2->resetUpdatedFields();
166
+
167
+        $this->assertEquals([NodeWrittenEvent::class], $this->mapper->getAllConfiguredEvents('alice'));
168
+        $this->assertEquals([NodeWrittenEvent::class], $this->mapper->getAllConfiguredEvents(''));
169
+
170
+        $this->assertEquals([$listener1, $listener2], $this->mapper->getByEvent(NodeWrittenEvent::class, 'alice'));
171
+        $this->assertEquals([$listener2], $this->mapper->getByEvent(NodeWrittenEvent::class, 'otherUser'));
172
+        $this->assertEquals([$listener2], $this->mapper->getByEvent(NodeWrittenEvent::class));
173
+    }
174 174
 }
Please login to merge, or discard this patch.
apps/updatenotification/tests/Controller/AdminControllerTest.php 1 patch
Indentation   +53 added lines, -53 removed lines patch added patch discarded remove patch
@@ -22,63 +22,63 @@
 block discarded – undo
22 22
 use Test\TestCase;
23 23
 
24 24
 class AdminControllerTest extends TestCase {
25
-	private IRequest&MockObject $request;
26
-	private IJobList&MockObject $jobList;
27
-	private ISecureRandom&MockObject $secureRandom;
28
-	private IConfig&MockObject $config;
29
-	private ITimeFactory&MockObject $timeFactory;
30
-	private IL10N&MockObject $l10n;
31
-	private IAppConfig&MockObject $appConfig;
25
+    private IRequest&MockObject $request;
26
+    private IJobList&MockObject $jobList;
27
+    private ISecureRandom&MockObject $secureRandom;
28
+    private IConfig&MockObject $config;
29
+    private ITimeFactory&MockObject $timeFactory;
30
+    private IL10N&MockObject $l10n;
31
+    private IAppConfig&MockObject $appConfig;
32 32
 
33
-	private AdminController $adminController;
33
+    private AdminController $adminController;
34 34
 
35
-	protected function setUp(): void {
36
-		parent::setUp();
35
+    protected function setUp(): void {
36
+        parent::setUp();
37 37
 
38
-		$this->request = $this->createMock(IRequest::class);
39
-		$this->jobList = $this->createMock(IJobList::class);
40
-		$this->secureRandom = $this->createMock(ISecureRandom::class);
41
-		$this->config = $this->createMock(IConfig::class);
42
-		$this->appConfig = $this->createMock(IAppConfig::class);
43
-		$this->timeFactory = $this->createMock(ITimeFactory::class);
44
-		$this->l10n = $this->createMock(IL10N::class);
38
+        $this->request = $this->createMock(IRequest::class);
39
+        $this->jobList = $this->createMock(IJobList::class);
40
+        $this->secureRandom = $this->createMock(ISecureRandom::class);
41
+        $this->config = $this->createMock(IConfig::class);
42
+        $this->appConfig = $this->createMock(IAppConfig::class);
43
+        $this->timeFactory = $this->createMock(ITimeFactory::class);
44
+        $this->l10n = $this->createMock(IL10N::class);
45 45
 
46
-		$this->adminController = new AdminController(
47
-			'updatenotification',
48
-			$this->request,
49
-			$this->jobList,
50
-			$this->secureRandom,
51
-			$this->config,
52
-			$this->appConfig,
53
-			$this->timeFactory,
54
-			$this->l10n
55
-		);
56
-	}
46
+        $this->adminController = new AdminController(
47
+            'updatenotification',
48
+            $this->request,
49
+            $this->jobList,
50
+            $this->secureRandom,
51
+            $this->config,
52
+            $this->appConfig,
53
+            $this->timeFactory,
54
+            $this->l10n
55
+        );
56
+    }
57 57
 
58
-	public function testCreateCredentials(): void {
59
-		$this->jobList
60
-			->expects($this->once())
61
-			->method('add')
62
-			->with(ResetToken::class);
63
-		$this->secureRandom
64
-			->expects($this->once())
65
-			->method('generate')
66
-			->with(64)
67
-			->willReturn('MyGeneratedToken');
68
-		$this->config
69
-			->expects($this->once())
70
-			->method('setSystemValue')
71
-			->with('updater.secret');
72
-		$this->timeFactory
73
-			->expects($this->once())
74
-			->method('getTime')
75
-			->willReturn(12345);
76
-		$this->appConfig
77
-			->expects($this->once())
78
-			->method('setValueInt')
79
-			->with('core', 'updater.secret.created', 12345);
58
+    public function testCreateCredentials(): void {
59
+        $this->jobList
60
+            ->expects($this->once())
61
+            ->method('add')
62
+            ->with(ResetToken::class);
63
+        $this->secureRandom
64
+            ->expects($this->once())
65
+            ->method('generate')
66
+            ->with(64)
67
+            ->willReturn('MyGeneratedToken');
68
+        $this->config
69
+            ->expects($this->once())
70
+            ->method('setSystemValue')
71
+            ->with('updater.secret');
72
+        $this->timeFactory
73
+            ->expects($this->once())
74
+            ->method('getTime')
75
+            ->willReturn(12345);
76
+        $this->appConfig
77
+            ->expects($this->once())
78
+            ->method('setValueInt')
79
+            ->with('core', 'updater.secret.created', 12345);
80 80
 
81
-		$expected = new DataResponse('MyGeneratedToken');
82
-		$this->assertEquals($expected, $this->adminController->createCredentials());
83
-	}
81
+        $expected = new DataResponse('MyGeneratedToken');
82
+        $this->assertEquals($expected, $this->adminController->createCredentials());
83
+    }
84 84
 }
Please login to merge, or discard this patch.
apps/updatenotification/tests/Settings/AdminTest.php 2 patches
Indentation   +437 added lines, -437 removed lines patch added patch discarded remove patch
@@ -29,441 +29,441 @@
 block discarded – undo
29 29
 use Test\TestCase;
30 30
 
31 31
 class AdminTest extends TestCase {
32
-	private IFactory&MockObject $l10nFactory;
33
-	private IConfig&MockObject $config;
34
-	private IAppConfig&MockObject $appConfig;
35
-	private UpdateChecker&MockObject $updateChecker;
36
-	private IGroupManager&MockObject $groupManager;
37
-	private IDateTimeFormatter&MockObject $dateTimeFormatter;
38
-	private IRegistry&MockObject $subscriptionRegistry;
39
-	private IUserManager&MockObject $userManager;
40
-	private LoggerInterface&MockObject $logger;
41
-	private IInitialState&MockObject $initialState;
42
-	private ServerVersion&MockObject $serverVersion;
43
-	private Admin $admin;
44
-
45
-	protected function setUp(): void {
46
-		parent::setUp();
47
-
48
-		$this->config = $this->createMock(IConfig::class);
49
-		$this->appConfig = $this->createMock(IAppConfig::class);
50
-		$this->updateChecker = $this->createMock(UpdateChecker::class);
51
-		$this->groupManager = $this->createMock(IGroupManager::class);
52
-		$this->dateTimeFormatter = $this->createMock(IDateTimeFormatter::class);
53
-		$this->l10nFactory = $this->createMock(IFactory::class);
54
-		$this->subscriptionRegistry = $this->createMock(IRegistry::class);
55
-		$this->userManager = $this->createMock(IUserManager::class);
56
-		$this->logger = $this->createMock(LoggerInterface::class);
57
-		$this->initialState = $this->createMock(IInitialState::class);
58
-		$this->serverVersion = $this->createMock(ServerVersion::class);
59
-
60
-		$this->admin = new Admin(
61
-			$this->config,
62
-			$this->appConfig,
63
-			$this->updateChecker,
64
-			$this->groupManager,
65
-			$this->dateTimeFormatter,
66
-			$this->l10nFactory,
67
-			$this->subscriptionRegistry,
68
-			$this->userManager,
69
-			$this->logger,
70
-			$this->initialState,
71
-			$this->serverVersion,
72
-		);
73
-	}
74
-
75
-	public function testGetFormWithUpdate(): void {
76
-		$this->serverVersion->expects(self::atLeastOnce())
77
-			->method('getChannel')
78
-			->willReturn('daily');
79
-		$this->userManager
80
-			->expects($this->once())
81
-			->method('countUsersTotal')
82
-			->willReturn(5);
83
-		$channels = [
84
-			'daily',
85
-			'beta',
86
-			'stable',
87
-			'production',
88
-		];
89
-		$this->appConfig
90
-			->expects($this->once())
91
-			->method('getValueInt')
92
-			->with('core', 'lastupdatedat', 0)
93
-			->willReturn(12345);
94
-		$this->appConfig
95
-			->expects($this->once())
96
-			->method('getValueArray')
97
-			->with(Application::APP_NAME, 'notify_groups', ['admin'])
98
-			->willReturn(['admin']);
99
-		$this->config
100
-			->method('getSystemValue')
101
-			->willReturnMap([
102
-				['updater.server.url', 'https://updates.nextcloud.com/updater_server/', 'https://updates.nextcloud.com/updater_server/'],
103
-				['upgrade.disable-web', false, false],
104
-			]);
105
-		$this->config
106
-			->expects(self::any())
107
-			->method('getSystemValueBool')
108
-			->with('updatechecker', true)
109
-			->willReturn(true);
110
-		$this->dateTimeFormatter
111
-			->expects($this->once())
112
-			->method('formatDateTime')
113
-			->with(12345)
114
-			->willReturn('LastCheckedReturnValue');
115
-		$this->updateChecker
116
-			->expects($this->once())
117
-			->method('getUpdateState')
118
-			->willReturn([
119
-				'updateAvailable' => true,
120
-				'updateVersion' => '8.1.2',
121
-				'updateVersionString' => 'Nextcloud 8.1.2',
122
-				'downloadLink' => 'https://downloads.nextcloud.org/server',
123
-				'changes' => [],
124
-				'updaterEnabled' => true,
125
-				'versionIsEol' => false,
126
-			]);
127
-
128
-		$group = $this->createMock(IGroup::class);
129
-		$group->expects($this->any())
130
-			->method('getDisplayName')
131
-			->willReturn('Administrators');
132
-		$group->expects($this->any())
133
-			->method('getGID')
134
-			->willReturn('admin');
135
-		$this->groupManager->expects($this->once())
136
-			->method('get')
137
-			->with('admin')
138
-			->willReturn($group);
139
-
140
-		$this->subscriptionRegistry
141
-			->expects($this->once())
142
-			->method('delegateHasValidSubscription')
143
-			->willReturn(true);
144
-
145
-		$this->initialState->expects($this->once())
146
-			->method('provideInitialState')
147
-			->with('data', [
148
-				'isNewVersionAvailable' => true,
149
-				'isUpdateChecked' => true,
150
-				'lastChecked' => 'LastCheckedReturnValue',
151
-				'currentChannel' => 'daily',
152
-				'channels' => $channels,
153
-				'newVersion' => '8.1.2',
154
-				'newVersionString' => 'Nextcloud 8.1.2',
155
-				'downloadLink' => 'https://downloads.nextcloud.org/server',
156
-				'changes' => [],
157
-				'webUpdaterEnabled' => true,
158
-				'isWebUpdaterRecommended' => true,
159
-				'updaterEnabled' => true,
160
-				'versionIsEol' => false,
161
-				'isDefaultUpdateServerURL' => true,
162
-				'updateServerURL' => 'https://updates.nextcloud.com/updater_server/',
163
-				'notifyGroups' => [
164
-					['id' => 'admin', 'displayname' => 'Administrators'],
165
-				],
166
-				'hasValidSubscription' => true,
167
-			]);
168
-
169
-		$expected = new TemplateResponse(Application::APP_NAME, 'admin', [], '');
170
-		$this->assertEquals($expected, $this->admin->getForm());
171
-	}
172
-
173
-	public function testGetFormWithUpdateAndChangedUpdateServer(): void {
174
-		$this->serverVersion->expects(self::atLeastOnce())
175
-			->method('getChannel')
176
-			->willReturn('beta');
177
-		$this->userManager
178
-			->expects($this->once())
179
-			->method('countUsersTotal')
180
-			->willReturn(5);
181
-		$channels = [
182
-			'daily',
183
-			'beta',
184
-			'stable',
185
-			'production',
186
-		];
187
-
188
-		$this->appConfig
189
-			->expects($this->once())
190
-			->method('getValueInt')
191
-			->with('core', 'lastupdatedat', 0)
192
-			->willReturn(12345);
193
-		$this->config
194
-			->expects(self::any())
195
-			->method('getSystemValueBool')
196
-			->with('updatechecker', true)
197
-			->willReturn(true);
198
-		$this->appConfig
199
-			->expects($this->once())
200
-			->method('getValueArray')
201
-			->with(Application::APP_NAME, 'notify_groups', ['admin'])
202
-			->willReturn(['admin']);
203
-		$this->config
204
-			->method('getSystemValue')
205
-			->willReturnMap([
206
-				['updater.server.url', 'https://updates.nextcloud.com/updater_server/', 'https://updates.nextcloud.com/updater_server_changed/'],
207
-				['upgrade.disable-web', false, true],
208
-			]);
209
-		$this->dateTimeFormatter
210
-			->expects($this->once())
211
-			->method('formatDateTime')
212
-			->with('12345')
213
-			->willReturn('LastCheckedReturnValue');
214
-		$this->updateChecker
215
-			->expects($this->once())
216
-			->method('getUpdateState')
217
-			->willReturn([
218
-				'updateAvailable' => true,
219
-				'updateVersion' => '8.1.2',
220
-				'updateVersionString' => 'Nextcloud 8.1.2',
221
-				'downloadLink' => 'https://downloads.nextcloud.org/server',
222
-				'changes' => [],
223
-				'updaterEnabled' => true,
224
-				'versionIsEol' => false,
225
-			]);
226
-
227
-		$group = $this->createMock(IGroup::class);
228
-		$group->expects($this->any())
229
-			->method('getDisplayName')
230
-			->willReturn('Administrators');
231
-		$group->expects($this->any())
232
-			->method('getGID')
233
-			->willReturn('admin');
234
-		$this->groupManager->expects($this->once())
235
-			->method('get')
236
-			->with('admin')
237
-			->willReturn($group);
238
-
239
-		$this->subscriptionRegistry
240
-			->expects($this->once())
241
-			->method('delegateHasValidSubscription')
242
-			->willReturn(true);
243
-
244
-		$this->initialState->expects($this->once())
245
-			->method('provideInitialState')
246
-			->with('data', [
247
-				'isNewVersionAvailable' => true,
248
-				'isUpdateChecked' => true,
249
-				'lastChecked' => 'LastCheckedReturnValue',
250
-				'currentChannel' => 'beta',
251
-				'channels' => $channels,
252
-				'newVersion' => '8.1.2',
253
-				'newVersionString' => 'Nextcloud 8.1.2',
254
-				'downloadLink' => 'https://downloads.nextcloud.org/server',
255
-				'changes' => [],
256
-				'webUpdaterEnabled' => false,
257
-				'isWebUpdaterRecommended' => true,
258
-				'updaterEnabled' => true,
259
-				'versionIsEol' => false,
260
-				'isDefaultUpdateServerURL' => false,
261
-				'updateServerURL' => 'https://updates.nextcloud.com/updater_server_changed/',
262
-				'notifyGroups' => [
263
-					['id' => 'admin', 'displayname' => 'Administrators'],
264
-				],
265
-				'hasValidSubscription' => true,
266
-			]);
267
-
268
-		$expected = new TemplateResponse(Application::APP_NAME, 'admin', [], '');
269
-		$this->assertEquals($expected, $this->admin->getForm());
270
-	}
271
-
272
-	public function testGetFormWithUpdateAndCustomersUpdateServer(): void {
273
-		$this->serverVersion->expects(self::atLeastOnce())
274
-			->method('getChannel')
275
-			->willReturn('production');
276
-		$this->userManager
277
-			->expects($this->once())
278
-			->method('countUsersTotal')
279
-			->willReturn(5);
280
-		$channels = [
281
-			'daily',
282
-			'beta',
283
-			'stable',
284
-			'production',
285
-		];
286
-
287
-		$this->appConfig
288
-			->expects($this->once())
289
-			->method('getValueInt')
290
-			->with('core', 'lastupdatedat', 0)
291
-			->willReturn(12345);
292
-		$this->config
293
-			->expects(self::any())
294
-			->method('getSystemValueBool')
295
-			->with('updatechecker', true)
296
-			->willReturn(true);
297
-		$this->appConfig
298
-			->expects(self::once())
299
-			->method('getValueArray')
300
-			->with(Application::APP_NAME, 'notify_groups', ['admin'])
301
-			->willReturn(['admin']);
302
-		$this->config
303
-			->method('getSystemValue')
304
-			->willReturnMap([
305
-				['updater.server.url', 'https://updates.nextcloud.com/updater_server/', 'https://updates.nextcloud.com/customers/ABC-DEF/'],
306
-				['upgrade.disable-web', false, false],
307
-			]);
308
-		$this->dateTimeFormatter
309
-			->expects($this->once())
310
-			->method('formatDateTime')
311
-			->with('12345')
312
-			->willReturn('LastCheckedReturnValue');
313
-		$this->updateChecker
314
-			->expects($this->once())
315
-			->method('getUpdateState')
316
-			->willReturn([
317
-				'updateAvailable' => true,
318
-				'updateVersion' => '8.1.2',
319
-				'updateVersionString' => 'Nextcloud 8.1.2',
320
-				'downloadLink' => 'https://downloads.nextcloud.org/server',
321
-				'changes' => [],
322
-				'updaterEnabled' => true,
323
-				'versionIsEol' => false,
324
-			]);
325
-
326
-		$group = $this->createMock(IGroup::class);
327
-		$group->expects($this->any())
328
-			->method('getDisplayName')
329
-			->willReturn('Administrators');
330
-		$group->expects($this->any())
331
-			->method('getGID')
332
-			->willReturn('admin');
333
-		$this->groupManager->expects($this->once())
334
-			->method('get')
335
-			->with('admin')
336
-			->willReturn($group);
337
-
338
-		$this->subscriptionRegistry
339
-			->expects($this->once())
340
-			->method('delegateHasValidSubscription')
341
-			->willReturn(true);
342
-
343
-		$this->initialState->expects($this->once())
344
-			->method('provideInitialState')
345
-			->with('data', [
346
-				'isNewVersionAvailable' => true,
347
-				'isUpdateChecked' => true,
348
-				'lastChecked' => 'LastCheckedReturnValue',
349
-				'currentChannel' => 'production',
350
-				'channels' => $channels,
351
-				'newVersion' => '8.1.2',
352
-				'newVersionString' => 'Nextcloud 8.1.2',
353
-				'downloadLink' => 'https://downloads.nextcloud.org/server',
354
-				'changes' => [],
355
-				'webUpdaterEnabled' => true,
356
-				'isWebUpdaterRecommended' => true,
357
-				'updaterEnabled' => true,
358
-				'versionIsEol' => false,
359
-				'isDefaultUpdateServerURL' => true,
360
-				'updateServerURL' => 'https://updates.nextcloud.com/customers/ABC-DEF/',
361
-				'notifyGroups' => [
362
-					['id' => 'admin', 'displayname' => 'Administrators'],
363
-				],
364
-				'hasValidSubscription' => true,
365
-			]);
366
-
367
-		$expected = new TemplateResponse(Application::APP_NAME, 'admin', [], '');
368
-		$this->assertEquals($expected, $this->admin->getForm());
369
-	}
370
-
371
-
372
-	public function testGetSection(): void {
373
-		$this->config
374
-			->expects(self::atLeastOnce())
375
-			->method('getSystemValueBool')
376
-			->with('updatechecker', true)
377
-			->willReturn(true);
378
-
379
-		$this->assertSame('overview', $this->admin->getSection());
380
-	}
381
-
382
-	public function testGetSectionDisabled(): void {
383
-		$this->config
384
-			->expects(self::atLeastOnce())
385
-			->method('getSystemValueBool')
386
-			->with('updatechecker', true)
387
-			->willReturn(false);
388
-
389
-		$this->assertNull($this->admin->getSection());
390
-	}
391
-
392
-	public function testGetPriority(): void {
393
-		$this->assertSame(11, $this->admin->getPriority());
394
-	}
395
-
396
-	public static function changesProvider(): array {
397
-		return [
398
-			[ #0, all info, en
399
-				[
400
-					'changelogURL' => 'https://go.to.changelog',
401
-					'whatsNew' => [
402
-						'en' => [
403
-							'regular' => ['content'],
404
-						],
405
-						'de' => [
406
-							'regular' => ['inhalt'],
407
-						]
408
-					],
409
-				],
410
-				'en',
411
-				[
412
-					'changelogURL' => 'https://go.to.changelog',
413
-					'whatsNew' => [
414
-						'regular' => ['content'],
415
-					],
416
-				]
417
-			],
418
-			[ #1, all info, de
419
-				[
420
-					'changelogURL' => 'https://go.to.changelog',
421
-					'whatsNew' => [
422
-						'en' => [
423
-							'regular' => ['content'],
424
-						],
425
-						'de' => [
426
-							'regular' => ['inhalt'],
427
-						]
428
-					],
429
-				],
430
-				'de',
431
-				[
432
-					'changelogURL' => 'https://go.to.changelog',
433
-					'whatsNew' => [
434
-						'regular' => ['inhalt'],
435
-					]
436
-				],
437
-			],
438
-			[ #2, just changelog
439
-				[ 'changelogURL' => 'https://go.to.changelog' ],
440
-				'en',
441
-				[ 'changelogURL' => 'https://go.to.changelog' ],
442
-			],
443
-			[ #3 nothing
444
-				[],
445
-				'ru',
446
-				[]
447
-			]
448
-		];
449
-	}
450
-
451
-	/**
452
-	 * @dataProvider changesProvider
453
-	 */
454
-	public function testFilterChanges($changes, $userLang, $expectation): void {
455
-		$iterator = $this->createMock(ILanguageIterator::class);
456
-		$iterator->expects($this->any())
457
-			->method('current')
458
-			->willReturnOnConsecutiveCalls('es', $userLang, 'it', 'en');
459
-		$iterator->expects($this->any())
460
-			->method('valid')
461
-			->willReturn(true);
462
-
463
-		$this->l10nFactory->expects($this->atMost(1))
464
-			->method('getLanguageIterator')
465
-			->willReturn($iterator);
466
-		$result = $this->invokePrivate($this->admin, 'filterChanges', [$changes]);
467
-		$this->assertSame($expectation, $result);
468
-	}
32
+    private IFactory&MockObject $l10nFactory;
33
+    private IConfig&MockObject $config;
34
+    private IAppConfig&MockObject $appConfig;
35
+    private UpdateChecker&MockObject $updateChecker;
36
+    private IGroupManager&MockObject $groupManager;
37
+    private IDateTimeFormatter&MockObject $dateTimeFormatter;
38
+    private IRegistry&MockObject $subscriptionRegistry;
39
+    private IUserManager&MockObject $userManager;
40
+    private LoggerInterface&MockObject $logger;
41
+    private IInitialState&MockObject $initialState;
42
+    private ServerVersion&MockObject $serverVersion;
43
+    private Admin $admin;
44
+
45
+    protected function setUp(): void {
46
+        parent::setUp();
47
+
48
+        $this->config = $this->createMock(IConfig::class);
49
+        $this->appConfig = $this->createMock(IAppConfig::class);
50
+        $this->updateChecker = $this->createMock(UpdateChecker::class);
51
+        $this->groupManager = $this->createMock(IGroupManager::class);
52
+        $this->dateTimeFormatter = $this->createMock(IDateTimeFormatter::class);
53
+        $this->l10nFactory = $this->createMock(IFactory::class);
54
+        $this->subscriptionRegistry = $this->createMock(IRegistry::class);
55
+        $this->userManager = $this->createMock(IUserManager::class);
56
+        $this->logger = $this->createMock(LoggerInterface::class);
57
+        $this->initialState = $this->createMock(IInitialState::class);
58
+        $this->serverVersion = $this->createMock(ServerVersion::class);
59
+
60
+        $this->admin = new Admin(
61
+            $this->config,
62
+            $this->appConfig,
63
+            $this->updateChecker,
64
+            $this->groupManager,
65
+            $this->dateTimeFormatter,
66
+            $this->l10nFactory,
67
+            $this->subscriptionRegistry,
68
+            $this->userManager,
69
+            $this->logger,
70
+            $this->initialState,
71
+            $this->serverVersion,
72
+        );
73
+    }
74
+
75
+    public function testGetFormWithUpdate(): void {
76
+        $this->serverVersion->expects(self::atLeastOnce())
77
+            ->method('getChannel')
78
+            ->willReturn('daily');
79
+        $this->userManager
80
+            ->expects($this->once())
81
+            ->method('countUsersTotal')
82
+            ->willReturn(5);
83
+        $channels = [
84
+            'daily',
85
+            'beta',
86
+            'stable',
87
+            'production',
88
+        ];
89
+        $this->appConfig
90
+            ->expects($this->once())
91
+            ->method('getValueInt')
92
+            ->with('core', 'lastupdatedat', 0)
93
+            ->willReturn(12345);
94
+        $this->appConfig
95
+            ->expects($this->once())
96
+            ->method('getValueArray')
97
+            ->with(Application::APP_NAME, 'notify_groups', ['admin'])
98
+            ->willReturn(['admin']);
99
+        $this->config
100
+            ->method('getSystemValue')
101
+            ->willReturnMap([
102
+                ['updater.server.url', 'https://updates.nextcloud.com/updater_server/', 'https://updates.nextcloud.com/updater_server/'],
103
+                ['upgrade.disable-web', false, false],
104
+            ]);
105
+        $this->config
106
+            ->expects(self::any())
107
+            ->method('getSystemValueBool')
108
+            ->with('updatechecker', true)
109
+            ->willReturn(true);
110
+        $this->dateTimeFormatter
111
+            ->expects($this->once())
112
+            ->method('formatDateTime')
113
+            ->with(12345)
114
+            ->willReturn('LastCheckedReturnValue');
115
+        $this->updateChecker
116
+            ->expects($this->once())
117
+            ->method('getUpdateState')
118
+            ->willReturn([
119
+                'updateAvailable' => true,
120
+                'updateVersion' => '8.1.2',
121
+                'updateVersionString' => 'Nextcloud 8.1.2',
122
+                'downloadLink' => 'https://downloads.nextcloud.org/server',
123
+                'changes' => [],
124
+                'updaterEnabled' => true,
125
+                'versionIsEol' => false,
126
+            ]);
127
+
128
+        $group = $this->createMock(IGroup::class);
129
+        $group->expects($this->any())
130
+            ->method('getDisplayName')
131
+            ->willReturn('Administrators');
132
+        $group->expects($this->any())
133
+            ->method('getGID')
134
+            ->willReturn('admin');
135
+        $this->groupManager->expects($this->once())
136
+            ->method('get')
137
+            ->with('admin')
138
+            ->willReturn($group);
139
+
140
+        $this->subscriptionRegistry
141
+            ->expects($this->once())
142
+            ->method('delegateHasValidSubscription')
143
+            ->willReturn(true);
144
+
145
+        $this->initialState->expects($this->once())
146
+            ->method('provideInitialState')
147
+            ->with('data', [
148
+                'isNewVersionAvailable' => true,
149
+                'isUpdateChecked' => true,
150
+                'lastChecked' => 'LastCheckedReturnValue',
151
+                'currentChannel' => 'daily',
152
+                'channels' => $channels,
153
+                'newVersion' => '8.1.2',
154
+                'newVersionString' => 'Nextcloud 8.1.2',
155
+                'downloadLink' => 'https://downloads.nextcloud.org/server',
156
+                'changes' => [],
157
+                'webUpdaterEnabled' => true,
158
+                'isWebUpdaterRecommended' => true,
159
+                'updaterEnabled' => true,
160
+                'versionIsEol' => false,
161
+                'isDefaultUpdateServerURL' => true,
162
+                'updateServerURL' => 'https://updates.nextcloud.com/updater_server/',
163
+                'notifyGroups' => [
164
+                    ['id' => 'admin', 'displayname' => 'Administrators'],
165
+                ],
166
+                'hasValidSubscription' => true,
167
+            ]);
168
+
169
+        $expected = new TemplateResponse(Application::APP_NAME, 'admin', [], '');
170
+        $this->assertEquals($expected, $this->admin->getForm());
171
+    }
172
+
173
+    public function testGetFormWithUpdateAndChangedUpdateServer(): void {
174
+        $this->serverVersion->expects(self::atLeastOnce())
175
+            ->method('getChannel')
176
+            ->willReturn('beta');
177
+        $this->userManager
178
+            ->expects($this->once())
179
+            ->method('countUsersTotal')
180
+            ->willReturn(5);
181
+        $channels = [
182
+            'daily',
183
+            'beta',
184
+            'stable',
185
+            'production',
186
+        ];
187
+
188
+        $this->appConfig
189
+            ->expects($this->once())
190
+            ->method('getValueInt')
191
+            ->with('core', 'lastupdatedat', 0)
192
+            ->willReturn(12345);
193
+        $this->config
194
+            ->expects(self::any())
195
+            ->method('getSystemValueBool')
196
+            ->with('updatechecker', true)
197
+            ->willReturn(true);
198
+        $this->appConfig
199
+            ->expects($this->once())
200
+            ->method('getValueArray')
201
+            ->with(Application::APP_NAME, 'notify_groups', ['admin'])
202
+            ->willReturn(['admin']);
203
+        $this->config
204
+            ->method('getSystemValue')
205
+            ->willReturnMap([
206
+                ['updater.server.url', 'https://updates.nextcloud.com/updater_server/', 'https://updates.nextcloud.com/updater_server_changed/'],
207
+                ['upgrade.disable-web', false, true],
208
+            ]);
209
+        $this->dateTimeFormatter
210
+            ->expects($this->once())
211
+            ->method('formatDateTime')
212
+            ->with('12345')
213
+            ->willReturn('LastCheckedReturnValue');
214
+        $this->updateChecker
215
+            ->expects($this->once())
216
+            ->method('getUpdateState')
217
+            ->willReturn([
218
+                'updateAvailable' => true,
219
+                'updateVersion' => '8.1.2',
220
+                'updateVersionString' => 'Nextcloud 8.1.2',
221
+                'downloadLink' => 'https://downloads.nextcloud.org/server',
222
+                'changes' => [],
223
+                'updaterEnabled' => true,
224
+                'versionIsEol' => false,
225
+            ]);
226
+
227
+        $group = $this->createMock(IGroup::class);
228
+        $group->expects($this->any())
229
+            ->method('getDisplayName')
230
+            ->willReturn('Administrators');
231
+        $group->expects($this->any())
232
+            ->method('getGID')
233
+            ->willReturn('admin');
234
+        $this->groupManager->expects($this->once())
235
+            ->method('get')
236
+            ->with('admin')
237
+            ->willReturn($group);
238
+
239
+        $this->subscriptionRegistry
240
+            ->expects($this->once())
241
+            ->method('delegateHasValidSubscription')
242
+            ->willReturn(true);
243
+
244
+        $this->initialState->expects($this->once())
245
+            ->method('provideInitialState')
246
+            ->with('data', [
247
+                'isNewVersionAvailable' => true,
248
+                'isUpdateChecked' => true,
249
+                'lastChecked' => 'LastCheckedReturnValue',
250
+                'currentChannel' => 'beta',
251
+                'channels' => $channels,
252
+                'newVersion' => '8.1.2',
253
+                'newVersionString' => 'Nextcloud 8.1.2',
254
+                'downloadLink' => 'https://downloads.nextcloud.org/server',
255
+                'changes' => [],
256
+                'webUpdaterEnabled' => false,
257
+                'isWebUpdaterRecommended' => true,
258
+                'updaterEnabled' => true,
259
+                'versionIsEol' => false,
260
+                'isDefaultUpdateServerURL' => false,
261
+                'updateServerURL' => 'https://updates.nextcloud.com/updater_server_changed/',
262
+                'notifyGroups' => [
263
+                    ['id' => 'admin', 'displayname' => 'Administrators'],
264
+                ],
265
+                'hasValidSubscription' => true,
266
+            ]);
267
+
268
+        $expected = new TemplateResponse(Application::APP_NAME, 'admin', [], '');
269
+        $this->assertEquals($expected, $this->admin->getForm());
270
+    }
271
+
272
+    public function testGetFormWithUpdateAndCustomersUpdateServer(): void {
273
+        $this->serverVersion->expects(self::atLeastOnce())
274
+            ->method('getChannel')
275
+            ->willReturn('production');
276
+        $this->userManager
277
+            ->expects($this->once())
278
+            ->method('countUsersTotal')
279
+            ->willReturn(5);
280
+        $channels = [
281
+            'daily',
282
+            'beta',
283
+            'stable',
284
+            'production',
285
+        ];
286
+
287
+        $this->appConfig
288
+            ->expects($this->once())
289
+            ->method('getValueInt')
290
+            ->with('core', 'lastupdatedat', 0)
291
+            ->willReturn(12345);
292
+        $this->config
293
+            ->expects(self::any())
294
+            ->method('getSystemValueBool')
295
+            ->with('updatechecker', true)
296
+            ->willReturn(true);
297
+        $this->appConfig
298
+            ->expects(self::once())
299
+            ->method('getValueArray')
300
+            ->with(Application::APP_NAME, 'notify_groups', ['admin'])
301
+            ->willReturn(['admin']);
302
+        $this->config
303
+            ->method('getSystemValue')
304
+            ->willReturnMap([
305
+                ['updater.server.url', 'https://updates.nextcloud.com/updater_server/', 'https://updates.nextcloud.com/customers/ABC-DEF/'],
306
+                ['upgrade.disable-web', false, false],
307
+            ]);
308
+        $this->dateTimeFormatter
309
+            ->expects($this->once())
310
+            ->method('formatDateTime')
311
+            ->with('12345')
312
+            ->willReturn('LastCheckedReturnValue');
313
+        $this->updateChecker
314
+            ->expects($this->once())
315
+            ->method('getUpdateState')
316
+            ->willReturn([
317
+                'updateAvailable' => true,
318
+                'updateVersion' => '8.1.2',
319
+                'updateVersionString' => 'Nextcloud 8.1.2',
320
+                'downloadLink' => 'https://downloads.nextcloud.org/server',
321
+                'changes' => [],
322
+                'updaterEnabled' => true,
323
+                'versionIsEol' => false,
324
+            ]);
325
+
326
+        $group = $this->createMock(IGroup::class);
327
+        $group->expects($this->any())
328
+            ->method('getDisplayName')
329
+            ->willReturn('Administrators');
330
+        $group->expects($this->any())
331
+            ->method('getGID')
332
+            ->willReturn('admin');
333
+        $this->groupManager->expects($this->once())
334
+            ->method('get')
335
+            ->with('admin')
336
+            ->willReturn($group);
337
+
338
+        $this->subscriptionRegistry
339
+            ->expects($this->once())
340
+            ->method('delegateHasValidSubscription')
341
+            ->willReturn(true);
342
+
343
+        $this->initialState->expects($this->once())
344
+            ->method('provideInitialState')
345
+            ->with('data', [
346
+                'isNewVersionAvailable' => true,
347
+                'isUpdateChecked' => true,
348
+                'lastChecked' => 'LastCheckedReturnValue',
349
+                'currentChannel' => 'production',
350
+                'channels' => $channels,
351
+                'newVersion' => '8.1.2',
352
+                'newVersionString' => 'Nextcloud 8.1.2',
353
+                'downloadLink' => 'https://downloads.nextcloud.org/server',
354
+                'changes' => [],
355
+                'webUpdaterEnabled' => true,
356
+                'isWebUpdaterRecommended' => true,
357
+                'updaterEnabled' => true,
358
+                'versionIsEol' => false,
359
+                'isDefaultUpdateServerURL' => true,
360
+                'updateServerURL' => 'https://updates.nextcloud.com/customers/ABC-DEF/',
361
+                'notifyGroups' => [
362
+                    ['id' => 'admin', 'displayname' => 'Administrators'],
363
+                ],
364
+                'hasValidSubscription' => true,
365
+            ]);
366
+
367
+        $expected = new TemplateResponse(Application::APP_NAME, 'admin', [], '');
368
+        $this->assertEquals($expected, $this->admin->getForm());
369
+    }
370
+
371
+
372
+    public function testGetSection(): void {
373
+        $this->config
374
+            ->expects(self::atLeastOnce())
375
+            ->method('getSystemValueBool')
376
+            ->with('updatechecker', true)
377
+            ->willReturn(true);
378
+
379
+        $this->assertSame('overview', $this->admin->getSection());
380
+    }
381
+
382
+    public function testGetSectionDisabled(): void {
383
+        $this->config
384
+            ->expects(self::atLeastOnce())
385
+            ->method('getSystemValueBool')
386
+            ->with('updatechecker', true)
387
+            ->willReturn(false);
388
+
389
+        $this->assertNull($this->admin->getSection());
390
+    }
391
+
392
+    public function testGetPriority(): void {
393
+        $this->assertSame(11, $this->admin->getPriority());
394
+    }
395
+
396
+    public static function changesProvider(): array {
397
+        return [
398
+            [ #0, all info, en
399
+                [
400
+                    'changelogURL' => 'https://go.to.changelog',
401
+                    'whatsNew' => [
402
+                        'en' => [
403
+                            'regular' => ['content'],
404
+                        ],
405
+                        'de' => [
406
+                            'regular' => ['inhalt'],
407
+                        ]
408
+                    ],
409
+                ],
410
+                'en',
411
+                [
412
+                    'changelogURL' => 'https://go.to.changelog',
413
+                    'whatsNew' => [
414
+                        'regular' => ['content'],
415
+                    ],
416
+                ]
417
+            ],
418
+            [ #1, all info, de
419
+                [
420
+                    'changelogURL' => 'https://go.to.changelog',
421
+                    'whatsNew' => [
422
+                        'en' => [
423
+                            'regular' => ['content'],
424
+                        ],
425
+                        'de' => [
426
+                            'regular' => ['inhalt'],
427
+                        ]
428
+                    ],
429
+                ],
430
+                'de',
431
+                [
432
+                    'changelogURL' => 'https://go.to.changelog',
433
+                    'whatsNew' => [
434
+                        'regular' => ['inhalt'],
435
+                    ]
436
+                ],
437
+            ],
438
+            [ #2, just changelog
439
+                [ 'changelogURL' => 'https://go.to.changelog' ],
440
+                'en',
441
+                [ 'changelogURL' => 'https://go.to.changelog' ],
442
+            ],
443
+            [ #3 nothing
444
+                [],
445
+                'ru',
446
+                []
447
+            ]
448
+        ];
449
+    }
450
+
451
+    /**
452
+     * @dataProvider changesProvider
453
+     */
454
+    public function testFilterChanges($changes, $userLang, $expectation): void {
455
+        $iterator = $this->createMock(ILanguageIterator::class);
456
+        $iterator->expects($this->any())
457
+            ->method('current')
458
+            ->willReturnOnConsecutiveCalls('es', $userLang, 'it', 'en');
459
+        $iterator->expects($this->any())
460
+            ->method('valid')
461
+            ->willReturn(true);
462
+
463
+        $this->l10nFactory->expects($this->atMost(1))
464
+            ->method('getLanguageIterator')
465
+            ->willReturn($iterator);
466
+        $result = $this->invokePrivate($this->admin, 'filterChanges', [$changes]);
467
+        $this->assertSame($expectation, $result);
468
+    }
469 469
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -395,7 +395,7 @@  discard block
 block discarded – undo
395 395
 
396 396
 	public static function changesProvider(): array {
397 397
 		return [
398
-			[ #0, all info, en
398
+			[#0, all info, en
399 399
 				[
400 400
 					'changelogURL' => 'https://go.to.changelog',
401 401
 					'whatsNew' => [
@@ -415,7 +415,7 @@  discard block
 block discarded – undo
415 415
 					],
416 416
 				]
417 417
 			],
418
-			[ #1, all info, de
418
+			[#1, all info, de
419 419
 				[
420 420
 					'changelogURL' => 'https://go.to.changelog',
421 421
 					'whatsNew' => [
@@ -435,12 +435,12 @@  discard block
 block discarded – undo
435 435
 					]
436 436
 				],
437 437
 			],
438
-			[ #2, just changelog
439
-				[ 'changelogURL' => 'https://go.to.changelog' ],
438
+			[#2, just changelog
439
+				['changelogURL' => 'https://go.to.changelog'],
440 440
 				'en',
441
-				[ 'changelogURL' => 'https://go.to.changelog' ],
441
+				['changelogURL' => 'https://go.to.changelog'],
442 442
 			],
443
-			[ #3 nothing
443
+			[#3 nothing
444 444
 				[],
445 445
 				'ru',
446 446
 				[]
Please login to merge, or discard this patch.
apps/updatenotification/tests/Notification/NotifierTest.php 1 patch
Indentation   +76 added lines, -76 removed lines patch added patch discarded remove patch
@@ -25,87 +25,87 @@
 block discarded – undo
25 25
 
26 26
 class NotifierTest extends TestCase {
27 27
 
28
-	protected IURLGenerator&MockObject $urlGenerator;
29
-	protected IAppConfig&MockObject $appConfig;
30
-	protected IManager&MockObject $notificationManager;
31
-	protected IFactory&MockObject $l10nFactory;
32
-	protected IUserSession&MockObject $userSession;
33
-	protected IGroupManager&MockObject $groupManager;
34
-	protected IAppManager&MockObject $appManager;
35
-	protected ServerVersion&MockObject $serverVersion;
28
+    protected IURLGenerator&MockObject $urlGenerator;
29
+    protected IAppConfig&MockObject $appConfig;
30
+    protected IManager&MockObject $notificationManager;
31
+    protected IFactory&MockObject $l10nFactory;
32
+    protected IUserSession&MockObject $userSession;
33
+    protected IGroupManager&MockObject $groupManager;
34
+    protected IAppManager&MockObject $appManager;
35
+    protected ServerVersion&MockObject $serverVersion;
36 36
 
37
-	protected function setUp(): void {
38
-		parent::setUp();
37
+    protected function setUp(): void {
38
+        parent::setUp();
39 39
 
40
-		$this->urlGenerator = $this->createMock(IURLGenerator::class);
41
-		$this->appConfig = $this->createMock(IAppConfig::class);
42
-		$this->notificationManager = $this->createMock(IManager::class);
43
-		$this->l10nFactory = $this->createMock(IFactory::class);
44
-		$this->userSession = $this->createMock(IUserSession::class);
45
-		$this->groupManager = $this->createMock(IGroupManager::class);
46
-		$this->appManager = $this->createMock(IAppManager::class);
47
-		$this->serverVersion = $this->createMock(ServerVersion::class);
48
-	}
40
+        $this->urlGenerator = $this->createMock(IURLGenerator::class);
41
+        $this->appConfig = $this->createMock(IAppConfig::class);
42
+        $this->notificationManager = $this->createMock(IManager::class);
43
+        $this->l10nFactory = $this->createMock(IFactory::class);
44
+        $this->userSession = $this->createMock(IUserSession::class);
45
+        $this->groupManager = $this->createMock(IGroupManager::class);
46
+        $this->appManager = $this->createMock(IAppManager::class);
47
+        $this->serverVersion = $this->createMock(ServerVersion::class);
48
+    }
49 49
 
50
-	/**
51
-	 * @param array $methods
52
-	 * @return Notifier|MockObject
53
-	 */
54
-	protected function getNotifier(array $methods = []): Notifier {
55
-		if (empty($methods)) {
56
-			return new Notifier(
57
-				$this->urlGenerator,
58
-				$this->appConfig,
59
-				$this->notificationManager,
60
-				$this->l10nFactory,
61
-				$this->userSession,
62
-				$this->groupManager,
63
-				$this->appManager,
64
-				$this->serverVersion,
65
-			);
66
-		}
67
-		{
68
-			return $this->getMockBuilder(Notifier::class)
69
-				->setConstructorArgs([
70
-					$this->urlGenerator,
71
-					$this->appConfig,
72
-					$this->notificationManager,
73
-					$this->l10nFactory,
74
-					$this->userSession,
75
-					$this->groupManager,
76
-					$this->appManager,
77
-					$this->serverVersion,
78
-				])
79
-				->onlyMethods($methods)
80
-				->getMock();
81
-		}
82
-	}
50
+    /**
51
+     * @param array $methods
52
+     * @return Notifier|MockObject
53
+     */
54
+    protected function getNotifier(array $methods = []): Notifier {
55
+        if (empty($methods)) {
56
+            return new Notifier(
57
+                $this->urlGenerator,
58
+                $this->appConfig,
59
+                $this->notificationManager,
60
+                $this->l10nFactory,
61
+                $this->userSession,
62
+                $this->groupManager,
63
+                $this->appManager,
64
+                $this->serverVersion,
65
+            );
66
+        }
67
+        {
68
+            return $this->getMockBuilder(Notifier::class)
69
+                ->setConstructorArgs([
70
+                    $this->urlGenerator,
71
+                    $this->appConfig,
72
+                    $this->notificationManager,
73
+                    $this->l10nFactory,
74
+                    $this->userSession,
75
+                    $this->groupManager,
76
+                    $this->appManager,
77
+                    $this->serverVersion,
78
+                ])
79
+                ->onlyMethods($methods)
80
+                ->getMock();
81
+        }
82
+    }
83 83
 
84
-	public static function dataUpdateAlreadyInstalledCheck(): array {
85
-		return [
86
-			['1.1.0', '1.0.0', false],
87
-			['1.1.0', '1.1.0', true],
88
-			['1.1.0', '1.2.0', true],
89
-		];
90
-	}
84
+    public static function dataUpdateAlreadyInstalledCheck(): array {
85
+        return [
86
+            ['1.1.0', '1.0.0', false],
87
+            ['1.1.0', '1.1.0', true],
88
+            ['1.1.0', '1.2.0', true],
89
+        ];
90
+    }
91 91
 
92
-	/**
93
-	 * @dataProvider dataUpdateAlreadyInstalledCheck
94
-	 */
95
-	public function testUpdateAlreadyInstalledCheck(string $versionNotification, string $versionInstalled, bool $exception): void {
96
-		$notifier = $this->getNotifier();
92
+    /**
93
+     * @dataProvider dataUpdateAlreadyInstalledCheck
94
+     */
95
+    public function testUpdateAlreadyInstalledCheck(string $versionNotification, string $versionInstalled, bool $exception): void {
96
+        $notifier = $this->getNotifier();
97 97
 
98
-		$notification = $this->createMock(INotification::class);
99
-		$notification->expects($this->once())
100
-			->method('getObjectId')
101
-			->willReturn($versionNotification);
98
+        $notification = $this->createMock(INotification::class);
99
+        $notification->expects($this->once())
100
+            ->method('getObjectId')
101
+            ->willReturn($versionNotification);
102 102
 
103
-		try {
104
-			self::invokePrivate($notifier, 'updateAlreadyInstalledCheck', [$notification, $versionInstalled]);
105
-			$this->assertFalse($exception);
106
-		} catch (\Exception $e) {
107
-			$this->assertTrue($exception);
108
-			$this->assertInstanceOf(AlreadyProcessedException::class, $e);
109
-		}
110
-	}
103
+        try {
104
+            self::invokePrivate($notifier, 'updateAlreadyInstalledCheck', [$notification, $versionInstalled]);
105
+            $this->assertFalse($exception);
106
+        } catch (\Exception $e) {
107
+            $this->assertTrue($exception);
108
+            $this->assertInstanceOf(AlreadyProcessedException::class, $e);
109
+        }
110
+    }
111 111
 }
Please login to merge, or discard this patch.
apps/updatenotification/tests/BackgroundJob/ResetTokenTest.php 1 patch
Indentation   +67 added lines, -67 removed lines patch added patch discarded remove patch
@@ -16,78 +16,78 @@
 block discarded – undo
16 16
 use Test\TestCase;
17 17
 
18 18
 class ResetTokenTest extends TestCase {
19
-	private IConfig&MockObject $config;
20
-	private IAppConfig&MockObject $appConfig;
21
-	private ITimeFactory&MockObject $timeFactory;
22
-	private BackgroundJobResetToken $resetTokenBackgroundJob;
19
+    private IConfig&MockObject $config;
20
+    private IAppConfig&MockObject $appConfig;
21
+    private ITimeFactory&MockObject $timeFactory;
22
+    private BackgroundJobResetToken $resetTokenBackgroundJob;
23 23
 
24
-	protected function setUp(): void {
25
-		parent::setUp();
26
-		$this->appConfig = $this->createMock(IAppConfig::class);
27
-		$this->config = $this->createMock(IConfig::class);
28
-		$this->timeFactory = $this->createMock(ITimeFactory::class);
29
-		$this->resetTokenBackgroundJob = new BackgroundJobResetToken(
30
-			$this->timeFactory,
31
-			$this->config,
32
-			$this->appConfig,
33
-		);
34
-	}
24
+    protected function setUp(): void {
25
+        parent::setUp();
26
+        $this->appConfig = $this->createMock(IAppConfig::class);
27
+        $this->config = $this->createMock(IConfig::class);
28
+        $this->timeFactory = $this->createMock(ITimeFactory::class);
29
+        $this->resetTokenBackgroundJob = new BackgroundJobResetToken(
30
+            $this->timeFactory,
31
+            $this->config,
32
+            $this->appConfig,
33
+        );
34
+    }
35 35
 
36
-	public function testRunWithNotExpiredToken(): void {
37
-		$this->timeFactory
38
-			->expects($this->atLeastOnce())
39
-			->method('getTime')
40
-			->willReturn(123);
41
-		$this->appConfig
42
-			->expects($this->once())
43
-			->method('getValueInt')
44
-			->with('core', 'updater.secret.created', 123);
45
-		$this->config
46
-			->expects($this->once())
47
-			->method('getSystemValueBool')
48
-			->with('config_is_read_only')
49
-			->willReturn(false);
50
-		$this->config
51
-			->expects($this->never())
52
-			->method('deleteSystemValue');
36
+    public function testRunWithNotExpiredToken(): void {
37
+        $this->timeFactory
38
+            ->expects($this->atLeastOnce())
39
+            ->method('getTime')
40
+            ->willReturn(123);
41
+        $this->appConfig
42
+            ->expects($this->once())
43
+            ->method('getValueInt')
44
+            ->with('core', 'updater.secret.created', 123);
45
+        $this->config
46
+            ->expects($this->once())
47
+            ->method('getSystemValueBool')
48
+            ->with('config_is_read_only')
49
+            ->willReturn(false);
50
+        $this->config
51
+            ->expects($this->never())
52
+            ->method('deleteSystemValue');
53 53
 
54
-		static::invokePrivate($this->resetTokenBackgroundJob, 'run', [null]);
55
-	}
54
+        static::invokePrivate($this->resetTokenBackgroundJob, 'run', [null]);
55
+    }
56 56
 
57
-	public function testRunWithExpiredToken(): void {
58
-		$this->timeFactory
59
-			->expects($this->once())
60
-			->method('getTime')
61
-			->willReturn(1455045234);
62
-		$this->appConfig
63
-			->expects($this->once())
64
-			->method('getValueInt')
65
-			->with('core', 'updater.secret.created', 1455045234)
66
-			->willReturn(2 * 24 * 60 * 60 + 1); // over 2 days
67
-		$this->config
68
-			->expects($this->once())
69
-			->method('deleteSystemValue')
70
-			->with('updater.secret');
57
+    public function testRunWithExpiredToken(): void {
58
+        $this->timeFactory
59
+            ->expects($this->once())
60
+            ->method('getTime')
61
+            ->willReturn(1455045234);
62
+        $this->appConfig
63
+            ->expects($this->once())
64
+            ->method('getValueInt')
65
+            ->with('core', 'updater.secret.created', 1455045234)
66
+            ->willReturn(2 * 24 * 60 * 60 + 1); // over 2 days
67
+        $this->config
68
+            ->expects($this->once())
69
+            ->method('deleteSystemValue')
70
+            ->with('updater.secret');
71 71
 
72
-		static::invokePrivate($this->resetTokenBackgroundJob, 'run', [null]);
73
-	}
72
+        static::invokePrivate($this->resetTokenBackgroundJob, 'run', [null]);
73
+    }
74 74
 
75
-	public function testRunWithExpiredTokenAndReadOnlyConfigFile(): void {
76
-		$this->timeFactory
77
-			->expects($this->never())
78
-			->method('getTime');
79
-		$this->appConfig
80
-			->expects($this->never())
81
-			->method('getValueInt');
82
-		$this->config
83
-			->expects($this->once())
84
-			->method('getSystemValueBool')
85
-			->with('config_is_read_only')
86
-			->willReturn(true);
87
-		$this->config
88
-			->expects($this->never())
89
-			->method('deleteSystemValue');
75
+    public function testRunWithExpiredTokenAndReadOnlyConfigFile(): void {
76
+        $this->timeFactory
77
+            ->expects($this->never())
78
+            ->method('getTime');
79
+        $this->appConfig
80
+            ->expects($this->never())
81
+            ->method('getValueInt');
82
+        $this->config
83
+            ->expects($this->once())
84
+            ->method('getSystemValueBool')
85
+            ->with('config_is_read_only')
86
+            ->willReturn(true);
87
+        $this->config
88
+            ->expects($this->never())
89
+            ->method('deleteSystemValue');
90 90
 
91
-		static::invokePrivate($this->resetTokenBackgroundJob, 'run', [null]);
92
-	}
91
+        static::invokePrivate($this->resetTokenBackgroundJob, 'run', [null]);
92
+    }
93 93
 }
Please login to merge, or discard this patch.
updatenotification/tests/BackgroundJob/UpdateAvailableNotificationsTest.php 2 patches
Indentation   +422 added lines, -422 removed lines patch added patch discarded remove patch
@@ -25,426 +25,426 @@
 block discarded – undo
25 25
 use Test\TestCase;
26 26
 
27 27
 class UpdateAvailableNotificationsTest extends TestCase {
28
-	private ServerVersion&MockObject $serverVersion;
29
-	private IConfig&MockObject $config;
30
-	private IManager&MockObject $notificationManager;
31
-	private IGroupManager&MockObject $groupManager;
32
-	private IAppManager&MockObject $appManager;
33
-	private IAppConfig&MockObject $appConfig;
34
-	private ITimeFactory&MockObject $timeFactory;
35
-	private Installer&MockObject $installer;
36
-	private VersionCheck&MockObject $versionCheck;
37
-
38
-	protected function setUp(): void {
39
-		parent::setUp();
40
-
41
-		$this->serverVersion = $this->createMock(ServerVersion::class);
42
-		$this->config = $this->createMock(IConfig::class);
43
-		$this->appConfig = $this->createMock(IAppConfig::class);
44
-		$this->notificationManager = $this->createMock(IManager::class);
45
-		$this->groupManager = $this->createMock(IGroupManager::class);
46
-		$this->appManager = $this->createMock(IAppManager::class);
47
-		$this->timeFactory = $this->createMock(ITimeFactory::class);
48
-		$this->installer = $this->createMock(Installer::class);
49
-		$this->versionCheck = $this->createMock(VersionCheck::class);
50
-	}
51
-
52
-	/**
53
-	 * @return UpdateAvailableNotifications|MockObject
54
-	 */
55
-	protected function getJob(array $methods = []): UpdateAvailableNotifications {
56
-		if (empty($methods)) {
57
-			return new UpdateAvailableNotifications(
58
-				$this->timeFactory,
59
-				$this->serverVersion,
60
-				$this->config,
61
-				$this->appConfig,
62
-				$this->notificationManager,
63
-				$this->groupManager,
64
-				$this->appManager,
65
-				$this->installer,
66
-				$this->versionCheck,
67
-			);
68
-		}
69
-		{
70
-			return $this->getMockBuilder(UpdateAvailableNotifications::class)
71
-				->setConstructorArgs([
72
-					$this->timeFactory,
73
-					$this->serverVersion,
74
-					$this->config,
75
-					$this->appConfig,
76
-					$this->notificationManager,
77
-					$this->groupManager,
78
-					$this->appManager,
79
-					$this->installer,
80
-					$this->versionCheck,
81
-				])
82
-				->onlyMethods($methods)
83
-				->getMock();
84
-		}
85
-	}
86
-
87
-	public function testRun(): void {
88
-		$job = $this->getJob([
89
-			'checkCoreUpdate',
90
-			'checkAppUpdates',
91
-		]);
92
-
93
-		$job->expects($this->once())
94
-			->method('checkCoreUpdate');
95
-		$job->expects($this->once())
96
-			->method('checkAppUpdates');
97
-
98
-		$this->config->expects(self::exactly(2))
99
-			->method('getSystemValueBool')
100
-			->willReturnMap([
101
-				['debug', false, true],
102
-				['has_internet_connection', true, true],
103
-			]);
104
-		self::invokePrivate($job, 'run', [null]);
105
-	}
106
-
107
-	public function testRunNoInternet(): void {
108
-		$job = $this->getJob([
109
-			'checkCoreUpdate',
110
-			'checkAppUpdates',
111
-		]);
112
-
113
-		$job->expects($this->never())
114
-			->method('checkCoreUpdate');
115
-		$job->expects($this->never())
116
-			->method('checkAppUpdates');
117
-
118
-		$this->config
119
-			->expects(self::once())
120
-			->method('getSystemValueBool')
121
-			->with('has_internet_connection', true)
122
-			->willReturn(false);
123
-
124
-		self::invokePrivate($job, 'run', [null]);
125
-	}
126
-
127
-	public static function dataCheckCoreUpdate(): array {
128
-		return [
129
-			['daily', null, null, null, null],
130
-			['git', null, null, null, null],
131
-			['beta', [], null, null, null],
132
-			['beta', false, false, null, null],
133
-			['beta', false, false, null, 13],
134
-			['beta', [
135
-				'version' => '9.2.0',
136
-				'versionstring' => 'Nextcloud 11.0.0',
137
-			], '9.2.0', 'Nextcloud 11.0.0', null],
138
-			['stable', [], null, null, null],
139
-			['stable', false, false, null, null],
140
-			['stable', false, false, null, 6],
141
-			['stable', [
142
-				'version' => '9.2.0',
143
-				'versionstring' => 'Nextcloud 11.0.0',
144
-			], '9.2.0', 'Nextcloud 11.0.0', null],
145
-			['production', [], null, null, null],
146
-			['production', false, false, null, null],
147
-			['production', false, false, null, 2],
148
-			['production', [
149
-				'version' => '9.2.0',
150
-				'versionstring' => 'Nextcloud 11.0.0',
151
-			], '9.2.0', 'Nextcloud 11.0.0', null],
152
-		];
153
-	}
154
-
155
-	/**
156
-	 * @dataProvider dataCheckCoreUpdate
157
-	 */
158
-	public function testCheckCoreUpdate(string $channel, mixed $versionCheck, mixed $version, ?string $readableVersion, ?int $errorDays): void {
159
-		$job = $this->getJob([
160
-			'createNotifications',
161
-			'clearErrorNotifications',
162
-			'sendErrorNotifications',
163
-		]);
164
-
165
-		$this->serverVersion->expects($this->once())
166
-			->method('getChannel')
167
-			->willReturn($channel);
168
-
169
-		if ($versionCheck === null) {
170
-			$this->versionCheck->expects($this->never())
171
-				->method('check');
172
-		} else {
173
-			$this->versionCheck->expects($this->once())
174
-				->method('check')
175
-				->willReturn($versionCheck);
176
-		}
177
-
178
-		if ($version === null) {
179
-			$job->expects($this->never())
180
-				->method('createNotifications');
181
-			$job->expects($versionCheck === null ? $this->never() : $this->once())
182
-				->method('clearErrorNotifications');
183
-		} elseif ($version === false) {
184
-			$job->expects($this->never())
185
-				->method('createNotifications');
186
-			$job->expects($this->never())
187
-				->method('clearErrorNotifications');
188
-
189
-			$this->appConfig->expects($this->once())
190
-				->method('getAppValueInt')
191
-				->willReturn($errorDays ?? 0);
192
-			$this->appConfig->expects($this->once())
193
-				->method('setAppValueInt')
194
-				->with('update_check_errors', $errorDays + 1);
195
-			$job->expects($errorDays !== null ? $this->once() : $this->never())
196
-				->method('sendErrorNotifications')
197
-				->with($errorDays + 1);
198
-		} else {
199
-			$this->appConfig->expects($this->once())
200
-				->method('setAppValueInt')
201
-				->with('update_check_errors', 0);
202
-			$job->expects($this->once())
203
-				->method('clearErrorNotifications');
204
-			$job->expects($this->once())
205
-				->method('createNotifications')
206
-				->with('core', $version, $readableVersion);
207
-		}
208
-
209
-		$this->config->expects(self::any())
210
-			->method('getSystemValueBool')
211
-			->willReturnMap([
212
-				['updatechecker', true, true],
213
-				['has_internet_connection', true, true],
214
-			]);
215
-
216
-		self::invokePrivate($job, 'checkCoreUpdate');
217
-	}
218
-
219
-	public static function dataCheckAppUpdates(): array {
220
-		return [
221
-			[
222
-				['app1', 'app2'],
223
-				[
224
-					['app1', false],
225
-					['app2', '1.9.2'],
226
-				],
227
-				[
228
-					['app2', '1.9.2', ''],
229
-				],
230
-			],
231
-		];
232
-	}
233
-
234
-	/**
235
-	 * @dataProvider dataCheckAppUpdates
236
-	 */
237
-	public function testCheckAppUpdates(array $apps, array $isUpdateAvailable, array $notifications): void {
238
-		$job = $this->getJob([
239
-			'isUpdateAvailable',
240
-			'createNotifications',
241
-		]);
242
-
243
-		$this->appManager->expects($this->once())
244
-			->method('getEnabledApps')
245
-			->willReturn($apps);
246
-
247
-		$job->expects($this->exactly(\count($apps)))
248
-			->method('isUpdateAvailable')
249
-			->willReturnMap($isUpdateAvailable);
250
-
251
-		$i = 0;
252
-		$job->expects($this->exactly(\count($notifications)))
253
-			->method('createNotifications')
254
-			->willReturnCallback(function () use ($notifications, &$i): void {
255
-				$this->assertEquals($notifications[$i], func_get_args());
256
-				$i++;
257
-			});
258
-
259
-
260
-		self::invokePrivate($job, 'checkAppUpdates');
261
-	}
262
-
263
-	public static function dataCreateNotifications(): array {
264
-		return [
265
-			['app1', '1.0.0', '1.0.0', false, false, null, null],
266
-			['app2', '1.0.1', '1.0.0', '1.0.0', true, ['user1'], [['user1']]],
267
-			['app3', '1.0.1', false, false, true, ['user2', 'user3'], [['user2'], ['user3']]],
268
-		];
269
-	}
270
-
271
-	/**
272
-	 * @dataProvider dataCreateNotifications
273
-	 */
274
-	public function testCreateNotifications(string $app, string $version, string|false $lastNotification, string|false $callDelete, bool $createNotification, ?array $users, ?array $userNotifications): void {
275
-		$job = $this->getJob([
276
-			'deleteOutdatedNotifications',
277
-			'getUsersToNotify',
278
-		]);
279
-
280
-		$this->appConfig->expects($this->once())
281
-			->method('getAppValueString')
282
-			->with($app, '')
283
-			->willReturn($lastNotification ?: '');
284
-
285
-		if ($lastNotification !== $version) {
286
-			$this->appConfig->expects($this->once())
287
-				->method('setAppValueString')
288
-				->with($app, $version);
289
-		}
290
-
291
-		if ($callDelete === false) {
292
-			$job->expects($this->never())
293
-				->method('deleteOutdatedNotifications');
294
-		} else {
295
-			$job->expects($this->once())
296
-				->method('deleteOutdatedNotifications')
297
-				->with($app, $callDelete);
298
-		}
299
-
300
-		if ($users === null) {
301
-			$job->expects($this->never())
302
-				->method('getUsersToNotify');
303
-		} else {
304
-			$job->expects($this->once())
305
-				->method('getUsersToNotify')
306
-				->willReturn($users);
307
-		}
308
-
309
-		if ($createNotification) {
310
-			$notification = $this->createMock(INotification::class);
311
-			$notification->expects($this->once())
312
-				->method('setApp')
313
-				->with('updatenotification')
314
-				->willReturnSelf();
315
-			$notification->expects($this->once())
316
-				->method('setDateTime')
317
-				->willReturnSelf();
318
-			$notification->expects($this->once())
319
-				->method('setObject')
320
-				->with($app, $version)
321
-				->willReturnSelf();
322
-			$notification->expects($this->once())
323
-				->method('setSubject')
324
-				->with('update_available')
325
-				->willReturnSelf();
326
-
327
-			if ($userNotifications !== null) {
328
-				$notification->expects($this->exactly(\count($userNotifications)))
329
-					->method('setUser')
330
-					->willReturnSelf();
331
-
332
-				$this->notificationManager->expects($this->exactly(\count($userNotifications)))
333
-					->method('notify');
334
-			}
335
-
336
-			$this->notificationManager->expects($this->once())
337
-				->method('createNotification')
338
-				->willReturn($notification);
339
-		} else {
340
-			$this->notificationManager->expects($this->never())
341
-				->method('createNotification');
342
-		}
343
-
344
-		self::invokePrivate($job, 'createNotifications', [$app, $version]);
345
-	}
346
-
347
-	public static function dataGetUsersToNotify(): array {
348
-		return [
349
-			[['g1', 'g2'], ['g1' => null, 'g2' => ['u1', 'u2']], ['u1', 'u2']],
350
-			[['g3', 'g4'], ['g3' => ['u1', 'u2'], 'g4' => ['u2', 'u3']], ['u1', 'u2', 'u3']],
351
-		];
352
-	}
353
-
354
-	/**
355
-	 * @dataProvider dataGetUsersToNotify
356
-	 */
357
-	public function testGetUsersToNotify(array $groups, array $groupUsers, array $expected): void {
358
-		$job = $this->getJob();
359
-
360
-		$this->appConfig->expects($this->once())
361
-			->method('getAppValueArray')
362
-			->with('notify_groups', ['admin'])
363
-			->willReturn($groups);
364
-
365
-		$groupMap = [];
366
-		foreach ($groupUsers as $gid => $uids) {
367
-			if ($uids === null) {
368
-				$group = null;
369
-			} else {
370
-				$group = $this->getGroup($gid);
371
-				$group->expects($this->any())
372
-					->method('getUsers')
373
-					->willReturn($this->getUsers($uids));
374
-			}
375
-			$groupMap[] = [$gid, $group];
376
-		}
377
-		$this->groupManager->expects($this->exactly(\count($groups)))
378
-			->method('get')
379
-			->willReturnMap($groupMap);
380
-
381
-		$result = self::invokePrivate($job, 'getUsersToNotify');
382
-		$this->assertEquals($expected, $result);
383
-
384
-		// Test caching
385
-		$result = self::invokePrivate($job, 'getUsersToNotify');
386
-		$this->assertEquals($expected, $result);
387
-	}
388
-
389
-	public static function dataDeleteOutdatedNotifications(): array {
390
-		return [
391
-			['app1', '1.1.0'],
392
-			['app2', '1.2.0'],
393
-		];
394
-	}
395
-
396
-	/**
397
-	 * @dataProvider dataDeleteOutdatedNotifications
398
-	 * @param string $app
399
-	 * @param string $version
400
-	 */
401
-	public function testDeleteOutdatedNotifications(string $app, string $version): void {
402
-		$notification = $this->createMock(INotification::class);
403
-		$notification->expects($this->once())
404
-			->method('setApp')
405
-			->with('updatenotification')
406
-			->willReturnSelf();
407
-		$notification->expects($this->once())
408
-			->method('setObject')
409
-			->with($app, $version)
410
-			->willReturnSelf();
411
-
412
-		$this->notificationManager->expects($this->once())
413
-			->method('createNotification')
414
-			->willReturn($notification);
415
-		$this->notificationManager->expects($this->once())
416
-			->method('markProcessed')
417
-			->with($notification);
418
-
419
-		$job = $this->getJob();
420
-		self::invokePrivate($job, 'deleteOutdatedNotifications', [$app, $version]);
421
-	}
422
-
423
-	/**
424
-	 * @param string[] $userIds
425
-	 * @return IUser[]|MockObject[]
426
-	 */
427
-	protected function getUsers(array $userIds): array {
428
-		$users = [];
429
-		foreach ($userIds as $uid) {
430
-			$user = $this->createMock(IUser::class);
431
-			$user->expects($this->any())
432
-				->method('getUID')
433
-				->willReturn($uid);
434
-			$users[] = $user;
435
-		}
436
-		return $users;
437
-	}
438
-
439
-	/**
440
-	 * @param string $gid
441
-	 * @return IGroup|MockObject
442
-	 */
443
-	protected function getGroup(string $gid) {
444
-		$group = $this->createMock(IGroup::class);
445
-		$group->expects($this->any())
446
-			->method('getGID')
447
-			->willReturn($gid);
448
-		return $group;
449
-	}
28
+    private ServerVersion&MockObject $serverVersion;
29
+    private IConfig&MockObject $config;
30
+    private IManager&MockObject $notificationManager;
31
+    private IGroupManager&MockObject $groupManager;
32
+    private IAppManager&MockObject $appManager;
33
+    private IAppConfig&MockObject $appConfig;
34
+    private ITimeFactory&MockObject $timeFactory;
35
+    private Installer&MockObject $installer;
36
+    private VersionCheck&MockObject $versionCheck;
37
+
38
+    protected function setUp(): void {
39
+        parent::setUp();
40
+
41
+        $this->serverVersion = $this->createMock(ServerVersion::class);
42
+        $this->config = $this->createMock(IConfig::class);
43
+        $this->appConfig = $this->createMock(IAppConfig::class);
44
+        $this->notificationManager = $this->createMock(IManager::class);
45
+        $this->groupManager = $this->createMock(IGroupManager::class);
46
+        $this->appManager = $this->createMock(IAppManager::class);
47
+        $this->timeFactory = $this->createMock(ITimeFactory::class);
48
+        $this->installer = $this->createMock(Installer::class);
49
+        $this->versionCheck = $this->createMock(VersionCheck::class);
50
+    }
51
+
52
+    /**
53
+     * @return UpdateAvailableNotifications|MockObject
54
+     */
55
+    protected function getJob(array $methods = []): UpdateAvailableNotifications {
56
+        if (empty($methods)) {
57
+            return new UpdateAvailableNotifications(
58
+                $this->timeFactory,
59
+                $this->serverVersion,
60
+                $this->config,
61
+                $this->appConfig,
62
+                $this->notificationManager,
63
+                $this->groupManager,
64
+                $this->appManager,
65
+                $this->installer,
66
+                $this->versionCheck,
67
+            );
68
+        }
69
+        {
70
+            return $this->getMockBuilder(UpdateAvailableNotifications::class)
71
+                ->setConstructorArgs([
72
+                    $this->timeFactory,
73
+                    $this->serverVersion,
74
+                    $this->config,
75
+                    $this->appConfig,
76
+                    $this->notificationManager,
77
+                    $this->groupManager,
78
+                    $this->appManager,
79
+                    $this->installer,
80
+                    $this->versionCheck,
81
+                ])
82
+                ->onlyMethods($methods)
83
+                ->getMock();
84
+        }
85
+    }
86
+
87
+    public function testRun(): void {
88
+        $job = $this->getJob([
89
+            'checkCoreUpdate',
90
+            'checkAppUpdates',
91
+        ]);
92
+
93
+        $job->expects($this->once())
94
+            ->method('checkCoreUpdate');
95
+        $job->expects($this->once())
96
+            ->method('checkAppUpdates');
97
+
98
+        $this->config->expects(self::exactly(2))
99
+            ->method('getSystemValueBool')
100
+            ->willReturnMap([
101
+                ['debug', false, true],
102
+                ['has_internet_connection', true, true],
103
+            ]);
104
+        self::invokePrivate($job, 'run', [null]);
105
+    }
106
+
107
+    public function testRunNoInternet(): void {
108
+        $job = $this->getJob([
109
+            'checkCoreUpdate',
110
+            'checkAppUpdates',
111
+        ]);
112
+
113
+        $job->expects($this->never())
114
+            ->method('checkCoreUpdate');
115
+        $job->expects($this->never())
116
+            ->method('checkAppUpdates');
117
+
118
+        $this->config
119
+            ->expects(self::once())
120
+            ->method('getSystemValueBool')
121
+            ->with('has_internet_connection', true)
122
+            ->willReturn(false);
123
+
124
+        self::invokePrivate($job, 'run', [null]);
125
+    }
126
+
127
+    public static function dataCheckCoreUpdate(): array {
128
+        return [
129
+            ['daily', null, null, null, null],
130
+            ['git', null, null, null, null],
131
+            ['beta', [], null, null, null],
132
+            ['beta', false, false, null, null],
133
+            ['beta', false, false, null, 13],
134
+            ['beta', [
135
+                'version' => '9.2.0',
136
+                'versionstring' => 'Nextcloud 11.0.0',
137
+            ], '9.2.0', 'Nextcloud 11.0.0', null],
138
+            ['stable', [], null, null, null],
139
+            ['stable', false, false, null, null],
140
+            ['stable', false, false, null, 6],
141
+            ['stable', [
142
+                'version' => '9.2.0',
143
+                'versionstring' => 'Nextcloud 11.0.0',
144
+            ], '9.2.0', 'Nextcloud 11.0.0', null],
145
+            ['production', [], null, null, null],
146
+            ['production', false, false, null, null],
147
+            ['production', false, false, null, 2],
148
+            ['production', [
149
+                'version' => '9.2.0',
150
+                'versionstring' => 'Nextcloud 11.0.0',
151
+            ], '9.2.0', 'Nextcloud 11.0.0', null],
152
+        ];
153
+    }
154
+
155
+    /**
156
+     * @dataProvider dataCheckCoreUpdate
157
+     */
158
+    public function testCheckCoreUpdate(string $channel, mixed $versionCheck, mixed $version, ?string $readableVersion, ?int $errorDays): void {
159
+        $job = $this->getJob([
160
+            'createNotifications',
161
+            'clearErrorNotifications',
162
+            'sendErrorNotifications',
163
+        ]);
164
+
165
+        $this->serverVersion->expects($this->once())
166
+            ->method('getChannel')
167
+            ->willReturn($channel);
168
+
169
+        if ($versionCheck === null) {
170
+            $this->versionCheck->expects($this->never())
171
+                ->method('check');
172
+        } else {
173
+            $this->versionCheck->expects($this->once())
174
+                ->method('check')
175
+                ->willReturn($versionCheck);
176
+        }
177
+
178
+        if ($version === null) {
179
+            $job->expects($this->never())
180
+                ->method('createNotifications');
181
+            $job->expects($versionCheck === null ? $this->never() : $this->once())
182
+                ->method('clearErrorNotifications');
183
+        } elseif ($version === false) {
184
+            $job->expects($this->never())
185
+                ->method('createNotifications');
186
+            $job->expects($this->never())
187
+                ->method('clearErrorNotifications');
188
+
189
+            $this->appConfig->expects($this->once())
190
+                ->method('getAppValueInt')
191
+                ->willReturn($errorDays ?? 0);
192
+            $this->appConfig->expects($this->once())
193
+                ->method('setAppValueInt')
194
+                ->with('update_check_errors', $errorDays + 1);
195
+            $job->expects($errorDays !== null ? $this->once() : $this->never())
196
+                ->method('sendErrorNotifications')
197
+                ->with($errorDays + 1);
198
+        } else {
199
+            $this->appConfig->expects($this->once())
200
+                ->method('setAppValueInt')
201
+                ->with('update_check_errors', 0);
202
+            $job->expects($this->once())
203
+                ->method('clearErrorNotifications');
204
+            $job->expects($this->once())
205
+                ->method('createNotifications')
206
+                ->with('core', $version, $readableVersion);
207
+        }
208
+
209
+        $this->config->expects(self::any())
210
+            ->method('getSystemValueBool')
211
+            ->willReturnMap([
212
+                ['updatechecker', true, true],
213
+                ['has_internet_connection', true, true],
214
+            ]);
215
+
216
+        self::invokePrivate($job, 'checkCoreUpdate');
217
+    }
218
+
219
+    public static function dataCheckAppUpdates(): array {
220
+        return [
221
+            [
222
+                ['app1', 'app2'],
223
+                [
224
+                    ['app1', false],
225
+                    ['app2', '1.9.2'],
226
+                ],
227
+                [
228
+                    ['app2', '1.9.2', ''],
229
+                ],
230
+            ],
231
+        ];
232
+    }
233
+
234
+    /**
235
+     * @dataProvider dataCheckAppUpdates
236
+     */
237
+    public function testCheckAppUpdates(array $apps, array $isUpdateAvailable, array $notifications): void {
238
+        $job = $this->getJob([
239
+            'isUpdateAvailable',
240
+            'createNotifications',
241
+        ]);
242
+
243
+        $this->appManager->expects($this->once())
244
+            ->method('getEnabledApps')
245
+            ->willReturn($apps);
246
+
247
+        $job->expects($this->exactly(\count($apps)))
248
+            ->method('isUpdateAvailable')
249
+            ->willReturnMap($isUpdateAvailable);
250
+
251
+        $i = 0;
252
+        $job->expects($this->exactly(\count($notifications)))
253
+            ->method('createNotifications')
254
+            ->willReturnCallback(function () use ($notifications, &$i): void {
255
+                $this->assertEquals($notifications[$i], func_get_args());
256
+                $i++;
257
+            });
258
+
259
+
260
+        self::invokePrivate($job, 'checkAppUpdates');
261
+    }
262
+
263
+    public static function dataCreateNotifications(): array {
264
+        return [
265
+            ['app1', '1.0.0', '1.0.0', false, false, null, null],
266
+            ['app2', '1.0.1', '1.0.0', '1.0.0', true, ['user1'], [['user1']]],
267
+            ['app3', '1.0.1', false, false, true, ['user2', 'user3'], [['user2'], ['user3']]],
268
+        ];
269
+    }
270
+
271
+    /**
272
+     * @dataProvider dataCreateNotifications
273
+     */
274
+    public function testCreateNotifications(string $app, string $version, string|false $lastNotification, string|false $callDelete, bool $createNotification, ?array $users, ?array $userNotifications): void {
275
+        $job = $this->getJob([
276
+            'deleteOutdatedNotifications',
277
+            'getUsersToNotify',
278
+        ]);
279
+
280
+        $this->appConfig->expects($this->once())
281
+            ->method('getAppValueString')
282
+            ->with($app, '')
283
+            ->willReturn($lastNotification ?: '');
284
+
285
+        if ($lastNotification !== $version) {
286
+            $this->appConfig->expects($this->once())
287
+                ->method('setAppValueString')
288
+                ->with($app, $version);
289
+        }
290
+
291
+        if ($callDelete === false) {
292
+            $job->expects($this->never())
293
+                ->method('deleteOutdatedNotifications');
294
+        } else {
295
+            $job->expects($this->once())
296
+                ->method('deleteOutdatedNotifications')
297
+                ->with($app, $callDelete);
298
+        }
299
+
300
+        if ($users === null) {
301
+            $job->expects($this->never())
302
+                ->method('getUsersToNotify');
303
+        } else {
304
+            $job->expects($this->once())
305
+                ->method('getUsersToNotify')
306
+                ->willReturn($users);
307
+        }
308
+
309
+        if ($createNotification) {
310
+            $notification = $this->createMock(INotification::class);
311
+            $notification->expects($this->once())
312
+                ->method('setApp')
313
+                ->with('updatenotification')
314
+                ->willReturnSelf();
315
+            $notification->expects($this->once())
316
+                ->method('setDateTime')
317
+                ->willReturnSelf();
318
+            $notification->expects($this->once())
319
+                ->method('setObject')
320
+                ->with($app, $version)
321
+                ->willReturnSelf();
322
+            $notification->expects($this->once())
323
+                ->method('setSubject')
324
+                ->with('update_available')
325
+                ->willReturnSelf();
326
+
327
+            if ($userNotifications !== null) {
328
+                $notification->expects($this->exactly(\count($userNotifications)))
329
+                    ->method('setUser')
330
+                    ->willReturnSelf();
331
+
332
+                $this->notificationManager->expects($this->exactly(\count($userNotifications)))
333
+                    ->method('notify');
334
+            }
335
+
336
+            $this->notificationManager->expects($this->once())
337
+                ->method('createNotification')
338
+                ->willReturn($notification);
339
+        } else {
340
+            $this->notificationManager->expects($this->never())
341
+                ->method('createNotification');
342
+        }
343
+
344
+        self::invokePrivate($job, 'createNotifications', [$app, $version]);
345
+    }
346
+
347
+    public static function dataGetUsersToNotify(): array {
348
+        return [
349
+            [['g1', 'g2'], ['g1' => null, 'g2' => ['u1', 'u2']], ['u1', 'u2']],
350
+            [['g3', 'g4'], ['g3' => ['u1', 'u2'], 'g4' => ['u2', 'u3']], ['u1', 'u2', 'u3']],
351
+        ];
352
+    }
353
+
354
+    /**
355
+     * @dataProvider dataGetUsersToNotify
356
+     */
357
+    public function testGetUsersToNotify(array $groups, array $groupUsers, array $expected): void {
358
+        $job = $this->getJob();
359
+
360
+        $this->appConfig->expects($this->once())
361
+            ->method('getAppValueArray')
362
+            ->with('notify_groups', ['admin'])
363
+            ->willReturn($groups);
364
+
365
+        $groupMap = [];
366
+        foreach ($groupUsers as $gid => $uids) {
367
+            if ($uids === null) {
368
+                $group = null;
369
+            } else {
370
+                $group = $this->getGroup($gid);
371
+                $group->expects($this->any())
372
+                    ->method('getUsers')
373
+                    ->willReturn($this->getUsers($uids));
374
+            }
375
+            $groupMap[] = [$gid, $group];
376
+        }
377
+        $this->groupManager->expects($this->exactly(\count($groups)))
378
+            ->method('get')
379
+            ->willReturnMap($groupMap);
380
+
381
+        $result = self::invokePrivate($job, 'getUsersToNotify');
382
+        $this->assertEquals($expected, $result);
383
+
384
+        // Test caching
385
+        $result = self::invokePrivate($job, 'getUsersToNotify');
386
+        $this->assertEquals($expected, $result);
387
+    }
388
+
389
+    public static function dataDeleteOutdatedNotifications(): array {
390
+        return [
391
+            ['app1', '1.1.0'],
392
+            ['app2', '1.2.0'],
393
+        ];
394
+    }
395
+
396
+    /**
397
+     * @dataProvider dataDeleteOutdatedNotifications
398
+     * @param string $app
399
+     * @param string $version
400
+     */
401
+    public function testDeleteOutdatedNotifications(string $app, string $version): void {
402
+        $notification = $this->createMock(INotification::class);
403
+        $notification->expects($this->once())
404
+            ->method('setApp')
405
+            ->with('updatenotification')
406
+            ->willReturnSelf();
407
+        $notification->expects($this->once())
408
+            ->method('setObject')
409
+            ->with($app, $version)
410
+            ->willReturnSelf();
411
+
412
+        $this->notificationManager->expects($this->once())
413
+            ->method('createNotification')
414
+            ->willReturn($notification);
415
+        $this->notificationManager->expects($this->once())
416
+            ->method('markProcessed')
417
+            ->with($notification);
418
+
419
+        $job = $this->getJob();
420
+        self::invokePrivate($job, 'deleteOutdatedNotifications', [$app, $version]);
421
+    }
422
+
423
+    /**
424
+     * @param string[] $userIds
425
+     * @return IUser[]|MockObject[]
426
+     */
427
+    protected function getUsers(array $userIds): array {
428
+        $users = [];
429
+        foreach ($userIds as $uid) {
430
+            $user = $this->createMock(IUser::class);
431
+            $user->expects($this->any())
432
+                ->method('getUID')
433
+                ->willReturn($uid);
434
+            $users[] = $user;
435
+        }
436
+        return $users;
437
+    }
438
+
439
+    /**
440
+     * @param string $gid
441
+     * @return IGroup|MockObject
442
+     */
443
+    protected function getGroup(string $gid) {
444
+        $group = $this->createMock(IGroup::class);
445
+        $group->expects($this->any())
446
+            ->method('getGID')
447
+            ->willReturn($gid);
448
+        return $group;
449
+    }
450 450
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -251,7 +251,7 @@  discard block
 block discarded – undo
251 251
 		$i = 0;
252 252
 		$job->expects($this->exactly(\count($notifications)))
253 253
 			->method('createNotifications')
254
-			->willReturnCallback(function () use ($notifications, &$i): void {
254
+			->willReturnCallback(function() use ($notifications, &$i): void {
255 255
 				$this->assertEquals($notifications[$i], func_get_args());
256 256
 				$i++;
257 257
 			});
@@ -271,7 +271,7 @@  discard block
 block discarded – undo
271 271
 	/**
272 272
 	 * @dataProvider dataCreateNotifications
273 273
 	 */
274
-	public function testCreateNotifications(string $app, string $version, string|false $lastNotification, string|false $callDelete, bool $createNotification, ?array $users, ?array $userNotifications): void {
274
+	public function testCreateNotifications(string $app, string $version, string | false $lastNotification, string | false $callDelete, bool $createNotification, ?array $users, ?array $userNotifications): void {
275 275
 		$job = $this->getJob([
276 276
 			'deleteOutdatedNotifications',
277 277
 			'getUsersToNotify',
Please login to merge, or discard this patch.
apps/twofactor_backupcodes/tests/Db/BackupCodeMapperTest.php 1 patch
Indentation   +84 added lines, -84 removed lines patch added patch discarded remove patch
@@ -19,88 +19,88 @@
 block discarded – undo
19 19
  * @group DB
20 20
  */
21 21
 class BackupCodeMapperTest extends TestCase {
22
-	private IDBConnection $db;
23
-	private BackupCodeMapper $mapper;
24
-	private string $testUID = 'test123456';
25
-
26
-	private function resetDB() {
27
-		$qb = $this->db->getQueryBuilder();
28
-		$qb->delete($this->mapper->getTableName())
29
-			->where($qb->expr()->eq('user_id', $qb->createNamedParameter($this->testUID)));
30
-		$qb->execute();
31
-	}
32
-
33
-	protected function setUp(): void {
34
-		parent::setUp();
35
-
36
-		$this->db = Server::get(IDBConnection::class);
37
-		$this->mapper = Server::get(BackupCodeMapper::class);
38
-
39
-		$this->resetDB();
40
-	}
41
-
42
-	protected function tearDown(): void {
43
-		parent::tearDown();
44
-
45
-		$this->resetDB();
46
-	}
47
-
48
-	public function testGetBackupCodes(): void {
49
-		$code1 = new BackupCode();
50
-		$code1->setUserId($this->testUID);
51
-		$code1->setCode('1|$2y$10$Fyo.DkMtkaHapVvRVbQBeeIdi5x/6nmPnxiBzD0GDKa08NMus5xze');
52
-		$code1->setUsed(1);
53
-
54
-		$code2 = new BackupCode();
55
-		$code2->setUserId($this->testUID);
56
-		$code2->setCode('1|$2y$10$nj3sZaCqGN8t6.SsnNADt.eX34UCkdX6FPx.r.rIwE6Jj3vi5wyt2');
57
-		$code2->setUsed(0);
58
-
59
-		$this->mapper->insert($code1);
60
-		$this->mapper->insert($code2);
61
-
62
-		$user = $this->getMockBuilder(IUser::class)->getMock();
63
-		$user->expects($this->once())
64
-			->method('getUID')
65
-			->willReturn($this->testUID);
66
-
67
-		$dbCodes = $this->mapper->getBackupCodes($user);
68
-
69
-		$this->assertCount(2, $dbCodes);
70
-		$this->assertInstanceOf(BackupCode::class, $dbCodes[0]);
71
-		$this->assertInstanceOf(BackupCode::class, $dbCodes[1]);
72
-	}
73
-
74
-	public function testDeleteCodes(): void {
75
-		$code = new BackupCode();
76
-		$code->setUserId($this->testUID);
77
-		$code->setCode('1|$2y$10$CagG8pEhZL.xDirtCCP/KuuWtnsAasgq60zY9rU46dBK4w8yW0Z/y');
78
-		$code->setUsed(1);
79
-		$user = $this->getMockBuilder(IUser::class)->getMock();
80
-		$user->expects($this->any())
81
-			->method('getUID')
82
-			->willReturn($this->testUID);
83
-
84
-		$this->mapper->insert($code);
85
-
86
-		$this->assertCount(1, $this->mapper->getBackupCodes($user));
87
-
88
-		$this->mapper->deleteCodes($user);
89
-
90
-		$this->assertCount(0, $this->mapper->getBackupCodes($user));
91
-	}
92
-
93
-	public function testInsertArgonEncryptedCodes(): void {
94
-		$code = new BackupCode();
95
-		$code->setUserId($this->testUID);
96
-		$code->setCode('2|$argon2i$v=19$m=1024,t=2,p=2$MjJWUjRFWndtMm5BWGxOag$BusVxLeFyiLLWtaVvX/JRFBiPdZcjRrzpQ/rAhn6vqY');
97
-		$code->setUsed(1);
98
-		$user = $this->getMockBuilder(IUser::class)->getMock();
99
-		$user->expects($this->any())
100
-			->method('getUID')
101
-			->willReturn($this->testUID);
102
-
103
-		$this->mapper->insert($code);
104
-		$this->assertCount(1, $this->mapper->getBackupCodes($user));
105
-	}
22
+    private IDBConnection $db;
23
+    private BackupCodeMapper $mapper;
24
+    private string $testUID = 'test123456';
25
+
26
+    private function resetDB() {
27
+        $qb = $this->db->getQueryBuilder();
28
+        $qb->delete($this->mapper->getTableName())
29
+            ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($this->testUID)));
30
+        $qb->execute();
31
+    }
32
+
33
+    protected function setUp(): void {
34
+        parent::setUp();
35
+
36
+        $this->db = Server::get(IDBConnection::class);
37
+        $this->mapper = Server::get(BackupCodeMapper::class);
38
+
39
+        $this->resetDB();
40
+    }
41
+
42
+    protected function tearDown(): void {
43
+        parent::tearDown();
44
+
45
+        $this->resetDB();
46
+    }
47
+
48
+    public function testGetBackupCodes(): void {
49
+        $code1 = new BackupCode();
50
+        $code1->setUserId($this->testUID);
51
+        $code1->setCode('1|$2y$10$Fyo.DkMtkaHapVvRVbQBeeIdi5x/6nmPnxiBzD0GDKa08NMus5xze');
52
+        $code1->setUsed(1);
53
+
54
+        $code2 = new BackupCode();
55
+        $code2->setUserId($this->testUID);
56
+        $code2->setCode('1|$2y$10$nj3sZaCqGN8t6.SsnNADt.eX34UCkdX6FPx.r.rIwE6Jj3vi5wyt2');
57
+        $code2->setUsed(0);
58
+
59
+        $this->mapper->insert($code1);
60
+        $this->mapper->insert($code2);
61
+
62
+        $user = $this->getMockBuilder(IUser::class)->getMock();
63
+        $user->expects($this->once())
64
+            ->method('getUID')
65
+            ->willReturn($this->testUID);
66
+
67
+        $dbCodes = $this->mapper->getBackupCodes($user);
68
+
69
+        $this->assertCount(2, $dbCodes);
70
+        $this->assertInstanceOf(BackupCode::class, $dbCodes[0]);
71
+        $this->assertInstanceOf(BackupCode::class, $dbCodes[1]);
72
+    }
73
+
74
+    public function testDeleteCodes(): void {
75
+        $code = new BackupCode();
76
+        $code->setUserId($this->testUID);
77
+        $code->setCode('1|$2y$10$CagG8pEhZL.xDirtCCP/KuuWtnsAasgq60zY9rU46dBK4w8yW0Z/y');
78
+        $code->setUsed(1);
79
+        $user = $this->getMockBuilder(IUser::class)->getMock();
80
+        $user->expects($this->any())
81
+            ->method('getUID')
82
+            ->willReturn($this->testUID);
83
+
84
+        $this->mapper->insert($code);
85
+
86
+        $this->assertCount(1, $this->mapper->getBackupCodes($user));
87
+
88
+        $this->mapper->deleteCodes($user);
89
+
90
+        $this->assertCount(0, $this->mapper->getBackupCodes($user));
91
+    }
92
+
93
+    public function testInsertArgonEncryptedCodes(): void {
94
+        $code = new BackupCode();
95
+        $code->setUserId($this->testUID);
96
+        $code->setCode('2|$argon2i$v=19$m=1024,t=2,p=2$MjJWUjRFWndtMm5BWGxOag$BusVxLeFyiLLWtaVvX/JRFBiPdZcjRrzpQ/rAhn6vqY');
97
+        $code->setUsed(1);
98
+        $user = $this->getMockBuilder(IUser::class)->getMock();
99
+        $user->expects($this->any())
100
+            ->method('getUID')
101
+            ->willReturn($this->testUID);
102
+
103
+        $this->mapper->insert($code);
104
+        $this->assertCount(1, $this->mapper->getBackupCodes($user));
105
+    }
106 106
 }
Please login to merge, or discard this patch.
apps/twofactor_backupcodes/tests/Service/BackupCodeStorageTest.php 1 patch
Indentation   +59 added lines, -59 removed lines patch added patch discarded remove patch
@@ -20,71 +20,71 @@
 block discarded – undo
20 20
  * @group DB
21 21
  */
22 22
 class BackupCodeStorageTest extends TestCase {
23
-	private IManager&MockObject $notificationManager;
24
-	private string $testUID = 'test123456789';
25
-	private BackupCodeStorage $storage;
23
+    private IManager&MockObject $notificationManager;
24
+    private string $testUID = 'test123456789';
25
+    private BackupCodeStorage $storage;
26 26
 
27
-	protected function setUp(): void {
28
-		parent::setUp();
27
+    protected function setUp(): void {
28
+        parent::setUp();
29 29
 
30
-		$this->storage = Server::get(BackupCodeStorage::class);
30
+        $this->storage = Server::get(BackupCodeStorage::class);
31 31
 
32
-		$this->notificationManager = $this->createMock(IManager::class);
33
-		$this->notificationManager->method('createNotification')
34
-			->willReturn(Server::get(IManager::class)->createNotification());
35
-		$this->overwriteService(IManager::class, $this->notificationManager);
36
-	}
32
+        $this->notificationManager = $this->createMock(IManager::class);
33
+        $this->notificationManager->method('createNotification')
34
+            ->willReturn(Server::get(IManager::class)->createNotification());
35
+        $this->overwriteService(IManager::class, $this->notificationManager);
36
+    }
37 37
 
38
-	public function testSimpleWorkFlow(): void {
39
-		$user = $this->getMockBuilder(IUser::class)->getMock();
40
-		$user->expects($this->any())
41
-			->method('getUID')
42
-			->willReturn($this->testUID);
38
+    public function testSimpleWorkFlow(): void {
39
+        $user = $this->getMockBuilder(IUser::class)->getMock();
40
+        $user->expects($this->any())
41
+            ->method('getUID')
42
+            ->willReturn($this->testUID);
43 43
 
44
-		$this->notificationManager->expects($this->once())
45
-			->method('markProcessed')
46
-			->with($this->callback(function (INotification $notification) {
47
-				return $notification->getUser() === $this->testUID &&
48
-					$notification->getObjectType() === 'create' &&
49
-					$notification->getObjectId() === 'codes' &&
50
-					$notification->getApp() === 'twofactor_backupcodes';
51
-			}));
44
+        $this->notificationManager->expects($this->once())
45
+            ->method('markProcessed')
46
+            ->with($this->callback(function (INotification $notification) {
47
+                return $notification->getUser() === $this->testUID &&
48
+                    $notification->getObjectType() === 'create' &&
49
+                    $notification->getObjectId() === 'codes' &&
50
+                    $notification->getApp() === 'twofactor_backupcodes';
51
+            }));
52 52
 
53
-		// Create codes
54
-		$codes = $this->storage->createCodes($user, 5);
55
-		$this->assertCount(5, $codes);
56
-		$this->assertTrue($this->storage->hasBackupCodes($user));
57
-		$initialState = [
58
-			'enabled' => true,
59
-			'total' => 5,
60
-			'used' => 0,
61
-		];
62
-		$this->assertEquals($initialState, $this->storage->getBackupCodesState($user));
53
+        // Create codes
54
+        $codes = $this->storage->createCodes($user, 5);
55
+        $this->assertCount(5, $codes);
56
+        $this->assertTrue($this->storage->hasBackupCodes($user));
57
+        $initialState = [
58
+            'enabled' => true,
59
+            'total' => 5,
60
+            'used' => 0,
61
+        ];
62
+        $this->assertEquals($initialState, $this->storage->getBackupCodesState($user));
63 63
 
64
-		// Use codes
65
-		$code = $codes[2];
66
-		$this->assertTrue($this->storage->validateCode($user, $code));
67
-		// Code must not be used twice
68
-		$this->assertFalse($this->storage->validateCode($user, $code));
69
-		// Invalid codes are invalid
70
-		$this->assertFalse($this->storage->validateCode($user, 'I DO NOT EXIST'));
71
-		$stateAfter = [
72
-			'enabled' => true,
73
-			'total' => 5,
74
-			'used' => 1,
75
-		];
76
-		$this->assertEquals($stateAfter, $this->storage->getBackupCodesState($user));
64
+        // Use codes
65
+        $code = $codes[2];
66
+        $this->assertTrue($this->storage->validateCode($user, $code));
67
+        // Code must not be used twice
68
+        $this->assertFalse($this->storage->validateCode($user, $code));
69
+        // Invalid codes are invalid
70
+        $this->assertFalse($this->storage->validateCode($user, 'I DO NOT EXIST'));
71
+        $stateAfter = [
72
+            'enabled' => true,
73
+            'total' => 5,
74
+            'used' => 1,
75
+        ];
76
+        $this->assertEquals($stateAfter, $this->storage->getBackupCodesState($user));
77 77
 
78
-		// Deplete codes
79
-		$this->assertTrue($this->storage->validateCode($user, $codes[0]));
80
-		$this->assertTrue($this->storage->validateCode($user, $codes[1]));
81
-		$this->assertTrue($this->storage->validateCode($user, $codes[3]));
82
-		$this->assertTrue($this->storage->validateCode($user, $codes[4]));
83
-		$stateAllUsed = [
84
-			'enabled' => true,
85
-			'total' => 5,
86
-			'used' => 5,
87
-		];
88
-		$this->assertEquals($stateAllUsed, $this->storage->getBackupCodesState($user));
89
-	}
78
+        // Deplete codes
79
+        $this->assertTrue($this->storage->validateCode($user, $codes[0]));
80
+        $this->assertTrue($this->storage->validateCode($user, $codes[1]));
81
+        $this->assertTrue($this->storage->validateCode($user, $codes[3]));
82
+        $this->assertTrue($this->storage->validateCode($user, $codes[4]));
83
+        $stateAllUsed = [
84
+            'enabled' => true,
85
+            'total' => 5,
86
+            'used' => 5,
87
+        ];
88
+        $this->assertEquals($stateAllUsed, $this->storage->getBackupCodesState($user));
89
+    }
90 90
 }
Please login to merge, or discard this patch.