Completed
Push — add/jetpack_connection_new_met... ( f4cb2d...8279ac )
by
unknown
13:40 queued 05:33
created

ManagerIntegrationTest   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 397
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Importance

Changes 0
Metric Value
dl 0
loc 397
rs 10
c 0
b 0
f 0
wmc 16
lcom 0
cbo 2

8 Methods

Rating   Name   Duplication   Size   Complexity  
A setUp() 0 4 1
A test_is_connected() 0 15 3
A is_connected_data_provider() 0 9 1
A test_get_connected_users() 0 32 1
A test_get_connection_owner_and_is_owner() 0 40 1
A test_has_connected_user_and_has_connected_admin() 0 47 1
B test_get_access_token() 0 35 7
B get_access_token_data_provider() 0 155 1
1
<?php // phpcs:ignore WordPress.Files.FileName.NotHyphenatedLowercase
2
/**
3
 * Connection Manager functionality testing.
4
 *
5
 * @package automattic/jetpack-connection
6
 */
7
8
namespace Automattic\Jetpack\Connection;
9
10
/**
11
 * Connection Manager functionality testing.
12
 */
13
class ManagerIntegrationTest extends \WorDBless\BaseTestCase {
14
15
	/**
16
	 * Initialize the object before running the test method.
17
	 */
18
	public function setUp() {
19
		parent::setUp();
20
		$this->manager = new Manager();
21
	}
22
23
	/**
24
	 * Test the `is_connected' method.
25
	 *
26
	 * @covers Automattic\Jetpack\Connection\Manager::is_connected
27
	 * @dataProvider is_connected_data_provider
28
	 *
29
	 * @param object|boolean $blog_token The blog token. False if the blog token does not exist.
30
	 * @param int|boolean    $blog_id The blog id. False if the blog id does not exist.
31
	 * @param boolean        $expected_output The expected output.
32
	 */
33
	public function test_is_connected( $blog_token, $blog_id, $expected_output ) {
34
		if ( $blog_token ) {
35
			\Jetpack_Options::update_option( 'blog_token', 'asdasd.123123' );
36
		} else {
37
			\Jetpack_Options::delete_option( 'blog_token' );
38
		}
39
40
		if ( $blog_id ) {
41
			\Jetpack_Options::update_option( 'id', $blog_id );
42
		} else {
43
			\Jetpack_Options::delete_option( 'id' );
44
		}
45
46
		$this->assertEquals( $expected_output, $this->manager->is_connected() );
47
	}
48
49
	/**
50
	 * Data provider for test_is_connected.
51
	 *
52
	 * Structure of the test data arrays:
53
	 *     [0] => 'blog_token'      object|boolean The blog token or false if the blog token does not exist.
54
	 *     [1] => 'blog_id'         int|boolean The blog id or false if the blog id does not exist.
55
	 *     [2] => 'expected_output' boolean The expected output of the call to is_connected.
56
	 */
57
	public function is_connected_data_provider() {
58
59
		return array(
60
			'blog token, blog id'       => array( true, 1234, true ),
61
			'blog token, no blog id'    => array( true, false, false ),
62
			'no blog token, blog id'    => array( false, 1234, false ),
63
			'no blog token, no blog id' => array( false, false, false ),
64
		);
65
	}
66
67
	/**
68
	 * Test get_connected_users
69
	 */
70
	public function test_get_connected_users() {
71
		$id_admin = wp_insert_user(
72
			array(
73
				'user_login' => 'admin',
74
				'user_pass'  => 'pass',
75
				'role'       => 'administrator',
76
			)
77
		);
78
79
		$id_author = wp_insert_user(
80
			array(
81
				'user_login' => 'author',
82
				'user_pass'  => 'pass',
83
				'role'       => 'author',
84
			)
85
		);
86
87
		\Jetpack_Options::update_option(
88
			'user_tokens',
89
			array(
90
				$id_admin  => 'asd123',
91
				$id_author => 'asd123',
92
			)
93
		);
94
95
		$all_users = $this->manager->get_connected_users();
96
		$admins    = $this->manager->get_connected_users( 'manage_options' );
97
98
		$this->assertCount( 2, $all_users );
99
		$this->assertCount( 1, $admins );
100
		$this->assertSame( $id_admin, $admins[0]->ID );
101
	}
102
103
	/**
104
	 * Test get_connection_owner and is_owner
105
	 */
106
	public function test_get_connection_owner_and_is_owner() {
107
		$this->assertFalse( $this->manager->get_connection_owner() );
108
		$this->assertFalse( $this->manager->is_owned() );
109
110
		$id_admin = wp_insert_user(
111
			array(
112
				'user_login' => 'admin',
113
				'user_pass'  => 'pass',
114
				'role'       => 'administrator',
115
			)
116
		);
117
118
		$id_author = wp_insert_user(
119
			array(
120
				'user_login' => 'author',
121
				'user_pass'  => 'pass',
122
				'role'       => 'author',
123
			)
124
		);
125
126
		\Jetpack_Options::update_option( 'master_user', $id_admin );
127
128
		// Before tokens are created, no owner is found.
129
		$this->assertFalse( $this->manager->get_connection_owner() );
130
		$this->assertFalse( $this->manager->is_owned() );
131
132
		\Jetpack_Options::update_option(
133
			'user_tokens',
134
			array(
135
				$id_admin  => 'asd.123.' . $id_admin,
136
				$id_author => 'asd.123.' . $id_author,
137
			)
138
		);
139
140
		$owner = $this->manager->get_connection_owner();
141
142
		$this->assertInstanceOf( 'WP_User', $owner );
143
		$this->assertSame( $id_admin, $owner->ID );
144
		$this->assertTrue( $this->manager->is_owned() );
145
	}
146
147
	/**
148
	 * Test has_connected_user and has_connected_admin
149
	 */
150
	public function test_has_connected_user_and_has_connected_admin() {
151
		$this->assertFalse( $this->manager->has_connected_user() );
152
		$this->assertFalse( $this->manager->has_connected_admin() );
153
154
		// Create the user.
155
		$id_author = wp_insert_user(
156
			array(
157
				'user_login' => 'author',
158
				'user_pass'  => 'pass',
159
				'role'       => 'author',
160
			)
161
		);
162
163
		$this->assertFalse( $this->manager->has_connected_user() );
164
		$this->assertFalse( $this->manager->has_connected_admin() );
165
166
		// Connect the user.
167
		\Jetpack_Options::update_option(
168
			'user_tokens',
169
			array(
170
				$id_author => 'asd.123.' . $id_author,
171
			)
172
		);
173
174
		$this->assertTrue( $this->manager->has_connected_user() );
175
		$this->assertFalse( $this->manager->has_connected_admin() );
176
177
		$id_admin = wp_insert_user(
178
			array(
179
				'user_login' => 'admin',
180
				'user_pass'  => 'pass',
181
				'role'       => 'administrator',
182
			)
183
		);
184
185
		\Jetpack_Options::update_option(
186
			'user_tokens',
187
			array(
188
				$id_admin  => 'asd.123.' . $id_admin,
189
				$id_author => 'asd.123.' . $id_author,
190
			)
191
		);
192
193
		$this->assertTrue( $this->manager->has_connected_user() );
194
		$this->assertTrue( $this->manager->has_connected_admin() );
195
196
	}
197
198
	/**
199
	 * Test get_access_token method
200
	 *
201
	 * @dataProvider get_access_token_data_provider
202
	 *
203
	 * @param bool|string $create_blog_token The blog token to be created.
204
	 * @param bool|array  $create_user_tokens The user tokens to be created.
205
	 * @param bool|int    $master_user The ID of the master user to be defined.
206
	 * @param bool|int    $user_id_query The user ID that will be used to fetch the token.
207
	 * @param bool|string $token_key_query The token_key that will be used to fetch the token.
208
	 * @param bool|string $expected_error_code If an error is expected, the error code.
209
	 * @param bool|object $expected_token If success is expected, the expected token object.
210
	 * @return void
211
	 */
212
	public function test_get_access_token( $create_blog_token, $create_user_tokens, $master_user, $user_id_query, $token_key_query, $expected_error_code, $expected_token ) {
213
214
		// Set up.
215
		if ( $create_blog_token ) {
216
			\Jetpack_Options::update_option( 'blog_token', $create_blog_token );
217
			\Jetpack_Options::update_option( 'id', 1234 );
218
		}
219
		if ( $create_user_tokens ) {
220
			\Jetpack_Options::update_option( 'user_tokens', $create_user_tokens );
221
			foreach ( array_keys( $create_user_tokens ) as $uid ) {
222
				wp_insert_user(
223
					array(
224
						'user_login' => 'sample_user' . $uid,
225
						'user_pass'  => 'asdqwe',
226
					)
227
				);
228
			}
229
			if ( $master_user ) {
230
				\Jetpack_Options::update_option( 'master_user', $master_user );
231
			}
232
		}
233
234
		if ( 'CONNECTION_OWNER' === $user_id_query ) {
235
			$user_id_query = $this->manager::CONNECTION_OWNER;
236
		}
237
238
		$token = $this->manager->get_access_token( $user_id_query, $token_key_query, false );
239
240
		if ( $expected_error_code ) {
241
			$this->assertInstanceOf( 'WP_Error', $token );
242
			$this->assertSame( $expected_error_code, $token->get_error_code() );
243
		} else {
244
			$this->assertEquals( $expected_token, $token );
245
		}
246
	}
247
248
	/**
249
	 * Data provider for test_get_access_token
250
	 *
251
	 * @return array
252
	 */
253
	public function get_access_token_data_provider() {
254
		return array(
255
			'no tokens'                        => array(
256
				false, // blog token.
257
				false, // user tokens.
258
				false, // master_user.
259
				false, // user_id_query.
260
				false, // token_key_query.
261
				'no_possible_tokens', // expected error code.
262
				false, // expected token.
263
			),
264
			'no tokens'                        => array(
265
				false, // blog token.
266
				false, // user tokens.
267
				false, // master_user.
268
				22, // user_id_query.
269
				false, // token_key_query.
270
				'no_user_tokens', // expected error code.
271
				false, // expected token.
272
			),
273
			'no tokens for the user'           => array(
274
				false, // blog token.
275
				array(
276
					11 => 'asd.zxc.11',
277
				), // user tokens.
278
				false, // master_user.
279
				22, // user_id_query.
280
				false, // token_key_query.
281
				'no_token_for_user', // expected error code.
282
				false, // expected token.
283
			),
284
			'malformed user token'             => array(
285
				false, // blog token.
286
				array(
287
					11 => 'asdzxc.11',
288
				), // user tokens.
289
				false, // master_user.
290
				11, // user_id_query.
291
				false, // token_key_query.
292
				'token_malformed', // expected error code.
293
				false, // expected token.
294
			),
295
			'user mismatch'                    => array(
296
				false, // blog token.
297
				array(
298
					11 => 'asd.zxc.22',
299
				), // user tokens.
300
				false, // master_user.
301
				11, // user_id_query.
302
				false, // token_key_query.
303
				'user_id_mismatch', // expected error code.
304
				false, // expected token.
305
			),
306
			'Connection owner not defined'     => array(
307
				false, // blog token.
308
				array(
309
					11 => 'asd.zxc.11',
310
				), // user tokens.
311
				false, // master_user.
312
				'CONNECTION_OWNER', // user_id_query.
313
				false, // token_key_query.
314
				'empty_master_user_option', // expected error code.
315
				false, // expected token.
316
			),
317
			'Connection owner'                 => array(
318
				false, // blog token.
319
				array(
320
					11 => 'asd.zxc.11',
321
				), // user tokens.
322
				11, // master_user.
323
				'CONNECTION_OWNER', // user_id_query.
324
				false, // token_key_query.
325
				false, // expected error code.
326
				(object) array(
327
					'secret'           => 'asd.zxc',
328
					'external_user_id' => 11,
329
				), // expected token.
330
			),
331
			'Find blog token'                  => array(
332
				'asdasd.qweqwe', // blog token.
333
				false, // user tokens.
334
				false, // master_user.
335
				false, // user_id_query.
336
				false, // token_key_query.
337
				false, // expected error code.
338
				(object) array(
339
					'secret'           => 'asdasd.qweqwe',
340
					'external_user_id' => 0,
341
				), // expected token.
342
			),
343
			'Find user token'                  => array(
344
				false, // blog token.
345
				array(
346
					11 => 'qwe.asd.11',
347
					12 => 'asd.zxc.12',
348
				), // user tokens.
349
				false, // master_user.
350
				11, // user_id_query.
351
				false, // token_key_query.
352
				false, // expected error code.
353
				(object) array(
354
					'secret'           => 'qwe.asd',
355
					'external_user_id' => 11,
356
				), // expected token.
357
			),
358
			'Find user token with secret'      => array(
359
				false, // blog token.
360
				array(
361
					11 => 'qwe.asd.11',
362
					12 => 'asd.zxc.12',
363
				), // user tokens.
364
				false, // master_user.
365
				12, // user_id_query.
366
				'asd', // token_key_query.
367
				false, // expected error code.
368
				(object) array(
369
					'secret'           => 'asd.zxc',
370
					'external_user_id' => 12,
371
				), // expected token.
372
			),
373
			'Find blog token with secret'      => array(
374
				'asdasd.qweqwe', // blog token.
375
				false, // user tokens.
376
				false, // master_user.
377
				false, // user_id_query.
378
				'asdasd', // token_key_query.
379
				false, // expected error code.
380
				(object) array(
381
					'secret'           => 'asdasd.qweqwe',
382
					'external_user_id' => 0,
383
				), // expected token.
384
			),
385
			'Dont find user token with secret' => array(
386
				false, // blog token.
387
				array(
388
					11 => 'qwe.asd.11',
389
					12 => 'asd.zxc.12',
390
				), // user tokens.
391
				false, // master_user.
392
				12, // user_id_query.
393
				'qqq', // token_key_query.
394
				'no_valid_user_token', // expected error code.
395
				false, // expected token.
396
			),
397
			'Dont find blog token with secret' => array(
398
				'asdasd.qweqwe', // blog token.
399
				false, // user tokens.
400
				false, // master_user.
401
				false, // user_id_query.
402
				'kaasdas', // token_key_query.
403
				'no_valid_blog_token', // expected error code.
404
				false, // expected token.
405
			),
406
		);
407
	}
408
409
}
410