Settings   A
last analyzed

Complexity

Total Complexity 30

Size/Duplication

Total Lines 885
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 441
dl 0
loc 885
rs 10
c 1
b 0
f 0
wmc 30

30 Methods

Rating   Name   Duplication   Size   Complexity  
A test_get_setting_without_permission() 0 5 1
A test_update_settings_without_permission() 0 16 1
A test_get_groups_none_registered() 0 9 1
A setUp() 0 7 1
A test_get_setting_empty_setting_id() 0 4 1
A test_update_setting_without_permission() 0 11 1
A test_update_settings() 0 42 1
A test_woocommerce_store_address() 0 29 1
A test_update_setting() 0 44 1
A test_woocommerce_store_city() 0 29 1
A test_get_setting() 0 24 1
A test_update_setting_bad_setting_id() 0 11 1
A test_validation_checkbox() 0 32 1
A test_get_groups() 0 42 1
B test_email_settings() 0 99 1
A test_get_setting_schema() 0 16 1
A test_get_group_without_permission() 0 5 1
A test_classic_settings() 0 50 1
A test_get_group() 0 21 1
A test_register_routes() 0 5 1
A test_woocommerce_store_address_2() 0 29 1
A test_get_setting_invalid_setting_id() 0 4 1
A test_get_groups_without_permission() 0 5 1
A test_woocommerce_default_country() 0 8 1
A test_validation_multiselect() 0 16 1
A test_get_group_schema() 0 11 1
A test_woocommerce_store_postcode() 0 29 1
A test_get_setting_invalid_setting_type() 0 17 1
A test_validation_select() 0 27 1
A test_validation_radio() 0 22 1
1
<?php
2
/**
3
 * Settings API Tests.
4
 *
5
 * @package WooCommerce\Tests\API
6
 * @since 3.5.0
7
 */
8
9
class Settings extends WC_REST_Unit_Test_Case {
0 ignored issues
show
Bug introduced by
The type WC_REST_Unit_Test_Case was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
10
11
	/**
12
	 * Setup our test server, endpoints, and user info.
13
	 */
14
	public function setUp() {
15
		parent::setUp();
16
		$this->endpoint = new WC_REST_Setting_Options_Controller();
0 ignored issues
show
Bug Best Practice introduced by
The property endpoint does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
17
		\Automattic\WooCommerce\RestApi\UnitTests\Helpers\SettingsHelper::register();
18
		$this->user = $this->factory->user->create(
0 ignored issues
show
Bug Best Practice introduced by
The property user does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
19
			array(
20
				'role' => 'administrator',
21
			)
22
		);
23
	}
24
25
	/**
26
	 * Test route registration.
27
	 *
28
	 * @since 3.5.0
29
	 */
30
	public function test_register_routes() {
31
		$routes = $this->server->get_routes();
32
		$this->assertArrayHasKey( '/wc/v3/settings', $routes );
33
		$this->assertArrayHasKey( '/wc/v3/settings/(?P<group_id>[\w-]+)', $routes );
34
		$this->assertArrayHasKey( '/wc/v3/settings/(?P<group_id>[\w-]+)/(?P<id>[\w-]+)', $routes );
35
	}
36
37
	/**
38
	 * Test getting all groups.
39
	 *
40
	 * @since 3.5.0
41
	 */
42
	public function test_get_groups() {
43
		wp_set_current_user( $this->user );
44
45
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings' ) );
46
		$data     = $response->get_data();
47
48
		$this->assertEquals( 200, $response->get_status() );
49
50
		$this->assertContains(
51
			array(
52
				'id'          => 'test',
53
				'label'       => 'Test extension',
54
				'parent_id'   => '',
55
				'description' => 'My awesome test settings.',
56
				'sub_groups'  => array( 'sub-test' ),
57
				'_links'      => array(
58
					'options' => array(
59
						array(
60
							'href' => rest_url( '/wc/v3/settings/test' ),
61
						),
62
					),
63
				),
64
			),
65
			$data
66
		);
67
68
		$this->assertContains(
69
			array(
70
				'id'          => 'sub-test',
71
				'label'       => 'Sub test',
72
				'parent_id'   => 'test',
73
				'description' => '',
74
				'sub_groups'  => array(),
75
				'_links'      => array(
76
					'options' => array(
77
						array(
78
							'href' => rest_url( '/wc/v3/settings/sub-test' ),
79
						),
80
					),
81
				),
82
			),
83
			$data
84
		);
85
	}
86
87
	/**
88
	 * Test /settings without valid permissions/creds.
89
	 *
90
	 * @since 3.5.0
91
	 */
92
	public function test_get_groups_without_permission() {
93
		wp_set_current_user( 0 );
94
95
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings' ) );
96
		$this->assertEquals( 401, $response->get_status() );
97
	}
98
99
	/**
100
	 * Test /settings without valid permissions/creds.
101
	 *
102
	 * @since 3.5.0
103
	 * @covers WC_Rest_Settings_Controller::get_items
104
	 */
105
	public function test_get_groups_none_registered() {
106
		wp_set_current_user( $this->user );
107
108
		remove_all_filters( 'woocommerce_settings_groups' );
109
110
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings' ) );
111
		$this->assertEquals( 500, $response->get_status() );
112
113
		\Automattic\WooCommerce\RestApi\UnitTests\Helpers\SettingsHelper::register();
114
	}
115
116
	/**
117
	 * Test groups schema.
118
	 *
119
	 * @since 3.5.0
120
	 */
121
	public function test_get_group_schema() {
122
		$request    = new WP_REST_Request( 'OPTIONS', '/wc/v3/settings' );
123
		$response   = $this->server->dispatch( $request );
124
		$data       = $response->get_data();
125
		$properties = $data['schema']['properties'];
126
		$this->assertEquals( 5, count( $properties ) );
127
		$this->assertArrayHasKey( 'id', $properties );
128
		$this->assertArrayHasKey( 'parent_id', $properties );
129
		$this->assertArrayHasKey( 'label', $properties );
130
		$this->assertArrayHasKey( 'description', $properties );
131
		$this->assertArrayHasKey( 'sub_groups', $properties );
132
	}
133
134
	/**
135
	 * Test settings schema.
136
	 *
137
	 * @since 3.5.0
138
	 */
139
	public function test_get_setting_schema() {
140
		$request    = new WP_REST_Request( 'OPTIONS', '/wc/v3/settings/test/woocommerce_shop_page_display' );
141
		$response   = $this->server->dispatch( $request );
142
		$data       = $response->get_data();
143
		$properties = $data['schema']['properties'];
144
		$this->assertEquals( 10, count( $properties ) );
145
		$this->assertArrayHasKey( 'id', $properties );
146
		$this->assertArrayHasKey( 'label', $properties );
147
		$this->assertArrayHasKey( 'description', $properties );
148
		$this->assertArrayHasKey( 'value', $properties );
149
		$this->assertArrayHasKey( 'default', $properties );
150
		$this->assertArrayHasKey( 'tip', $properties );
151
		$this->assertArrayHasKey( 'placeholder', $properties );
152
		$this->assertArrayHasKey( 'type', $properties );
153
		$this->assertArrayHasKey( 'options', $properties );
154
		$this->assertArrayHasKey( 'group_id', $properties );
155
	}
156
157
	/**
158
	 * Test getting a single group.
159
	 *
160
	 * @since 3.5.0
161
	 */
162
	public function test_get_group() {
163
		wp_set_current_user( $this->user );
164
165
		// test route callback receiving an empty group id
166
		$result = $this->endpoint->get_group_settings( '' );
167
		$this->assertWPError( $result );
168
169
		// test getting a group that does not exist
170
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/not-real' ) );
171
		$this->assertEquals( 404, $response->get_status() );
172
173
		// test getting the 'invalid' group
174
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/invalid' ) );
175
		$this->assertEquals( 404, $response->get_status() );
176
177
		// test getting a valid group with settings attached to it
178
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/test' ) );
179
		$data     = $response->get_data();
180
		$this->assertEquals( 1, count( $data ) );
181
		$this->assertEquals( 'woocommerce_shop_page_display', $data[0]['id'] );
182
		$this->assertEmpty( $data[0]['value'] );
183
	}
184
185
	/**
186
	 * Test getting a single group without permission.
187
	 *
188
	 * @since 3.5.0
189
	 */
190
	public function test_get_group_without_permission() {
191
		wp_set_current_user( 0 );
192
193
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/coupon-data' ) );
194
		$this->assertEquals( 401, $response->get_status() );
195
	}
196
197
	/**
198
	 * Test updating a single setting.
199
	 *
200
	 * @since 3.5.0
201
	 */
202
	public function test_update_setting() {
203
		wp_set_current_user( $this->user );
204
205
		// test defaults first
206
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/test/woocommerce_shop_page_display' ) );
207
		$data     = $response->get_data();
208
		$this->assertEquals( '', $data['value'] );
209
210
		// test updating shop display setting
211
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'test', 'woocommerce_shop_page_display' ) );
212
		$request->set_body_params(
213
			array(
214
				'value' => 'both',
215
			)
216
		);
217
		$response = $this->server->dispatch( $request );
218
		$data     = $response->get_data();
219
220
		$this->assertEquals( 'both', $data['value'] );
221
		$this->assertEquals( 'both', get_option( 'woocommerce_shop_page_display' ) );
222
223
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'test', 'woocommerce_shop_page_display' ) );
224
		$request->set_body_params(
225
			array(
226
				'value' => 'subcategories',
227
			)
228
		);
229
		$response = $this->server->dispatch( $request );
230
		$data     = $response->get_data();
231
232
		$this->assertEquals( 'subcategories', $data['value'] );
233
		$this->assertEquals( 'subcategories', get_option( 'woocommerce_shop_page_display' ) );
234
235
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'test', 'woocommerce_shop_page_display' ) );
236
		$request->set_body_params(
237
			array(
238
				'value' => '',
239
			)
240
		);
241
		$response = $this->server->dispatch( $request );
242
		$data     = $response->get_data();
243
244
		$this->assertEquals( '', $data['value'] );
245
		$this->assertEquals( '', get_option( 'woocommerce_shop_page_display' ) );
246
	}
247
248
	/**
249
	 * Test updating multiple settings at once.
250
	 *
251
	 * @since 3.5.0
252
	 */
253
	public function test_update_settings() {
254
		wp_set_current_user( $this->user );
255
256
		// test defaults first
257
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/test' ) );
258
		$data     = $response->get_data();
259
		$this->assertEquals( '', $data[0]['value'] );
260
261
		// test setting both at once
262
		$request = new WP_REST_Request( 'POST', '/wc/v3/settings/test/batch' );
263
		$request->set_body_params(
264
			array(
265
				'update' => array(
266
					array(
267
						'id'    => 'woocommerce_shop_page_display',
268
						'value' => 'both',
269
					),
270
				),
271
			)
272
		);
273
		$response = $this->server->dispatch( $request );
274
		$data     = $response->get_data();
275
276
		$this->assertEquals( 'both', $data['update'][0]['value'] );
277
		$this->assertEquals( 'both', get_option( 'woocommerce_shop_page_display' ) );
278
279
		// test updating one, but making sure the other value stays the same
280
		$request = new WP_REST_Request( 'POST', '/wc/v3/settings/test/batch' );
281
		$request->set_body_params(
282
			array(
283
				'update' => array(
284
					array(
285
						'id'    => 'woocommerce_shop_page_display',
286
						'value' => 'subcategories',
287
					),
288
				),
289
			)
290
		);
291
		$response = $this->server->dispatch( $request );
292
		$data     = $response->get_data();
293
		$this->assertEquals( 'subcategories', $data['update'][0]['value'] );
294
		$this->assertEquals( 'subcategories', get_option( 'woocommerce_shop_page_display' ) );
295
	}
296
297
	/**
298
	 * Test getting a single setting.
299
	 *
300
	 * @since 3.5.0
301
	 */
302
	public function test_get_setting() {
303
		wp_set_current_user( $this->user );
304
305
		// test getting an invalid setting from a group that does not exist
306
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/not-real/woocommerce_shop_page_display' ) );
307
		$data     = $response->get_data();
308
		$this->assertEquals( 404, $response->get_status() );
309
310
		// test getting an invalid setting from a group that does exist
311
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/invalid/invalid' ) );
312
		$data     = $response->get_data();
313
		$this->assertEquals( 404, $response->get_status() );
314
315
		// test getting a valid setting
316
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/test/woocommerce_shop_page_display' ) );
317
		$data     = $response->get_data();
318
319
		$this->assertEquals( 200, $response->get_status() );
320
321
		$this->assertEquals( 'woocommerce_shop_page_display', $data['id'] );
322
		$this->assertEquals( 'Shop page display', $data['label'] );
323
		$this->assertEquals( '', $data['default'] );
324
		$this->assertEquals( 'select', $data['type'] );
325
		$this->assertEquals( '', $data['value'] );
326
	}
327
328
	/**
329
	 * Test getting a single setting without valid user permissions.
330
	 *
331
	 * @since 3.5.0
332
	 */
333
	public function test_get_setting_without_permission() {
334
		wp_set_current_user( 0 );
335
336
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/test/woocommerce_shop_page_display' ) );
337
		$this->assertEquals( 401, $response->get_status() );
338
	}
339
340
	/**
341
	 * Tests the GET single setting route handler receiving an empty setting ID.
342
	 *
343
	 * @since 3.5.0
344
	 */
345
	public function test_get_setting_empty_setting_id() {
346
		$result = $this->endpoint->get_setting( 'test', '' );
347
348
		$this->assertWPError( $result );
349
	}
350
351
	/**
352
	 * Tests the GET single setting route handler receiving an invalid setting ID.
353
	 *
354
	 * @since 3.5.0
355
	 */
356
	public function test_get_setting_invalid_setting_id() {
357
		$result = $this->endpoint->get_setting( 'test', 'invalid' );
358
359
		$this->assertWPError( $result );
360
	}
361
362
	/**
363
	 * Tests the GET single setting route handler encountering an invalid setting type.
364
	 *
365
	 * @since 3.5.0
366
	 */
367
	public function test_get_setting_invalid_setting_type() {
368
		// $controller = $this->getMock( 'WC_Rest_Setting_Options_Controller', array( 'get_group_settings', 'is_setting_type_valid' ) );
369
		$controller = $this->getMockBuilder( 'WC_Rest_Setting_Options_Controller' )->setMethods( array( 'get_group_settings', 'is_setting_type_valid' ) )->getMock();
370
371
		$controller
372
			->expects( $this->any() )
373
			->method( 'get_group_settings' )
374
			->will( $this->returnValue( \Automattic\WooCommerce\RestApi\UnitTests\Helpers\SettingsHelper::register_test_settings( array() ) ) );
375
376
		$controller
377
			->expects( $this->any() )
378
			->method( 'is_setting_type_valid' )
379
			->will( $this->returnValue( false ) );
380
381
		$result = $controller->get_setting( 'test', 'woocommerce_shop_page_display' );
382
383
		$this->assertWPError( $result );
384
	}
385
386
	/**
387
	 * Test updating a single setting without valid user permissions.
388
	 *
389
	 * @since 3.5.0
390
	 */
391
	public function test_update_setting_without_permission() {
392
		wp_set_current_user( 0 );
393
394
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'test', 'woocommerce_shop_page_display' ) );
395
		$request->set_body_params(
396
			array(
397
				'value' => 'subcategories',
398
			)
399
		);
400
		$response = $this->server->dispatch( $request );
401
		$this->assertEquals( 401, $response->get_status() );
402
	}
403
404
405
	/**
406
	 * Test updating multiple settings without valid user permissions.
407
	 *
408
	 * @since 3.5.0
409
	 */
410
	public function test_update_settings_without_permission() {
411
		wp_set_current_user( 0 );
412
413
		$request = new WP_REST_Request( 'POST', '/wc/v3/settings/test/batch' );
414
		$request->set_body_params(
415
			array(
416
				'update' => array(
417
					array(
418
						'id'    => 'woocommerce_shop_page_display',
419
						'value' => 'subcategories',
420
					),
421
				),
422
			)
423
		);
424
		$response = $this->server->dispatch( $request );
425
		$this->assertEquals( 401, $response->get_status() );
426
	}
427
428
	/**
429
	 * Test updating a bad setting ID.
430
	 *
431
	 * @since 3.5.0
432
	 * @covers WC_Rest_Setting_Options_Controller::update_item
433
	 */
434
	public function test_update_setting_bad_setting_id() {
435
		wp_set_current_user( $this->user );
436
437
		$request = new WP_REST_Request( 'PUT', '/wc/v3/settings/test/invalid' );
438
		$request->set_body_params(
439
			array(
440
				'value' => 'test',
441
			)
442
		);
443
		$response = $this->server->dispatch( $request );
444
		$this->assertEquals( 404, $response->get_status() );
445
	}
446
447
	/**
448
	 * Tests our classic setting registration to make sure settings added for WP-Admin are available over the API.
449
	 *
450
	 * @since 3.5.0
451
	 */
452
	public function test_classic_settings() {
453
		wp_set_current_user( $this->user );
454
455
		// Make sure the group is properly registered
456
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/products' ) );
457
		$data     = $response->get_data();
458
		$this->assertTrue( is_array( $data ) );
459
		$this->assertContains(
460
			array(
461
				'id'          => 'woocommerce_downloads_require_login',
462
				'label'       => 'Access restriction',
463
				'description' => 'Downloads require login',
464
				'type'        => 'checkbox',
465
				'default'     => 'no',
466
				'tip'         => 'This setting does not apply to guest purchases.',
467
				'value'       => 'no',
468
				'_links'      => array(
469
					'self'       => array(
470
						array(
471
							'href' => rest_url( '/wc/v3/settings/products/woocommerce_downloads_require_login' ),
472
						),
473
					),
474
					'collection' => array(
475
						array(
476
							'href' => rest_url( '/wc/v3/settings/products' ),
477
						),
478
					),
479
				),
480
			),
481
			$data
482
		);
483
484
		// test get single
485
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/products/woocommerce_dimension_unit' ) );
486
		$data     = $response->get_data();
487
488
		$this->assertEquals( 'cm', $data['default'] );
489
490
		// test update
491
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'products', 'woocommerce_dimension_unit' ) );
492
		$request->set_body_params(
493
			array(
494
				'value' => 'yd',
495
			)
496
		);
497
		$response = $this->server->dispatch( $request );
498
		$data     = $response->get_data();
499
500
		$this->assertEquals( 'yd', $data['value'] );
501
		$this->assertEquals( 'yd', get_option( 'woocommerce_dimension_unit' ) );
502
	}
503
504
	/**
505
	 * Tests our email etting registration to make sure settings added for WP-Admin are available over the API.
506
	 *
507
	 * @since 3.5.0
508
	 */
509
	public function test_email_settings() {
510
		wp_set_current_user( $this->user );
511
512
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/email_new_order' ) );
513
		$settings = $response->get_data();
514
515
		$this->assertEquals( 200, $response->get_status() );
516
517
		$this->assertContains(
518
			array(
519
				'id'          => 'recipient',
520
				'label'       => 'Recipient(s)',
521
				'description' => 'Enter recipients (comma separated) for this email. Defaults to <code>[email protected]</code>.',
522
				'type'        => 'text',
523
				'default'     => '',
524
				'tip'         => 'Enter recipients (comma separated) for this email. Defaults to <code>[email protected]</code>.',
525
				'value'       => '',
526
				'_links'      => array(
527
					'self'       => array(
528
						array(
529
							'href' => rest_url( '/wc/v3/settings/email_new_order/recipient' ),
530
						),
531
					),
532
					'collection' => array(
533
						array(
534
							'href' => rest_url( '/wc/v3/settings/email_new_order' ),
535
						),
536
					),
537
				),
538
			),
539
			$settings
540
		);
541
542
		// test get single
543
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/email_new_order/subject' ) );
544
		$setting  = $response->get_data();
545
546
		$this->assertEquals(
547
			array(
548
				'id'          => 'subject',
549
				'label'       => 'Subject',
550
				'description' => 'Available placeholders: <code>{site_title}</code>, <code>{site_address}</code>, <code>{order_date}</code>, <code>{order_number}</code>',
551
				'type'        => 'text',
552
				'default'     => '',
553
				'tip'         => 'Available placeholders: <code>{site_title}</code>, <code>{site_address}</code>, <code>{order_date}</code>, <code>{order_number}</code>',
554
				'value'       => '',
555
				'group_id'    => 'email_new_order',
556
			),
557
			$setting
558
		);
559
560
		// test update
561
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'email_new_order', 'subject' ) );
562
		$request->set_body_params(
563
			array(
564
				'value' => 'This is my subject',
565
			)
566
		);
567
		$response = $this->server->dispatch( $request );
568
		$setting  = $response->get_data();
569
570
		$this->assertEquals(
571
			array(
572
				'id'          => 'subject',
573
				'label'       => 'Subject',
574
				'description' => 'Available placeholders: <code>{site_title}</code>, <code>{site_address}</code>, <code>{order_date}</code>, <code>{order_number}</code>',
575
				'type'        => 'text',
576
				'default'     => '',
577
				'tip'         => 'Available placeholders: <code>{site_title}</code>, <code>{site_address}</code>, <code>{order_date}</code>, <code>{order_number}</code>',
578
				'value'       => 'This is my subject',
579
				'group_id'    => 'email_new_order',
580
			),
581
			$setting
582
		);
583
584
		// test updating another subject and making sure it works with a "similar" id
585
		$request  = new WP_REST_Request( 'GET', sprintf( '/wc/v3/settings/%s/%s', 'email_customer_new_account', 'subject' ) );
586
		$response = $this->server->dispatch( $request );
587
		$setting  = $response->get_data();
588
589
		$this->assertEmpty( $setting['value'] );
590
591
		// test update
592
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'email_customer_new_account', 'subject' ) );
593
		$request->set_body_params(
594
			array(
595
				'value' => 'This is my new subject',
596
			)
597
		);
598
		$response = $this->server->dispatch( $request );
599
		$setting  = $response->get_data();
600
601
		$this->assertEquals( 'This is my new subject', $setting['value'] );
602
603
		// make sure the other is what we left it
604
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/email_new_order/subject' ) );
605
		$setting  = $response->get_data();
606
607
		$this->assertEquals( 'This is my subject', $setting['value'] );
608
	}
609
610
	/**
611
	 * Test validation of checkbox settings.
612
	 *
613
	 * @since 3.5.0
614
	 */
615
	public function test_validation_checkbox() {
616
		wp_set_current_user( $this->user );
617
618
		// test bogus value
619
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'email_cancelled_order', 'enabled' ) );
620
		$request->set_body_params(
621
			array(
622
				'value' => 'not_yes_or_no',
623
			)
624
		);
625
		$response = $this->server->dispatch( $request );
626
		$this->assertEquals( 400, $response->get_status() );
627
628
		// test yes
629
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'email_cancelled_order', 'enabled' ) );
630
		$request->set_body_params(
631
			array(
632
				'value' => 'yes',
633
			)
634
		);
635
		$response = $this->server->dispatch( $request );
636
		$this->assertEquals( 200, $response->get_status() );
637
638
		// test no
639
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'email_cancelled_order', 'enabled' ) );
640
		$request->set_body_params(
641
			array(
642
				'value' => 'no',
643
			)
644
		);
645
		$response = $this->server->dispatch( $request );
646
		$this->assertEquals( 200, $response->get_status() );
647
	}
648
649
	/**
650
	 * Test validation of radio settings.
651
	 *
652
	 * @since 3.5.0
653
	 */
654
	public function test_validation_radio() {
655
		wp_set_current_user( $this->user );
656
657
		// not a valid option
658
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'shipping', 'woocommerce_ship_to_destination' ) );
659
		$request->set_body_params(
660
			array(
661
				'value' => 'billing2',
662
			)
663
		);
664
		$response = $this->server->dispatch( $request );
665
		$this->assertEquals( 400, $response->get_status() );
666
667
		// valid
668
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'shipping', 'woocommerce_ship_to_destination' ) );
669
		$request->set_body_params(
670
			array(
671
				'value' => 'billing',
672
			)
673
		);
674
		$response = $this->server->dispatch( $request );
675
		$this->assertEquals( 200, $response->get_status() );
676
	}
677
678
	/**
679
	 * Test validation of multiselect.
680
	 *
681
	 * @since 3.5.0
682
	 */
683
	public function test_validation_multiselect() {
684
		wp_set_current_user( $this->user );
685
686
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', sprintf( '/wc/v3/settings/%s/%s', 'general', 'woocommerce_specific_allowed_countries' ) ) );
687
		$setting  = $response->get_data();
688
		$this->assertEmpty( $setting['value'] );
689
690
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'general', 'woocommerce_specific_allowed_countries' ) );
691
		$request->set_body_params(
692
			array(
693
				'value' => array( 'AX', 'DZ', 'MMM' ),
694
			)
695
		);
696
		$response = $this->server->dispatch( $request );
697
		$setting  = $response->get_data();
698
		$this->assertEquals( array( 'AX', 'DZ' ), $setting['value'] );
699
	}
700
701
	/**
702
	 * Test validation of select.
703
	 *
704
	 * @since 3.5.0
705
	 */
706
	public function test_validation_select() {
707
		wp_set_current_user( $this->user );
708
709
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', sprintf( '/wc/v3/settings/%s/%s', 'products', 'woocommerce_weight_unit' ) ) );
710
		$setting  = $response->get_data();
711
		$this->assertEquals( 'kg', $setting['value'] );
712
713
		// invalid
714
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'products', 'woocommerce_weight_unit' ) );
715
		$request->set_body_params(
716
			array(
717
				'value' => 'pounds', // invalid, should be lbs
718
			)
719
		);
720
		$response = $this->server->dispatch( $request );
721
		$this->assertEquals( 400, $response->get_status() );
722
723
		// valid
724
		$request = new WP_REST_Request( 'PUT', sprintf( '/wc/v3/settings/%s/%s', 'products', 'woocommerce_weight_unit' ) );
725
		$request->set_body_params(
726
			array(
727
				'value' => 'lbs', // invalid, should be lbs
728
			)
729
		);
730
		$response = $this->server->dispatch( $request );
731
		$setting  = $response->get_data();
732
		$this->assertEquals( 'lbs', $setting['value'] );
733
	}
734
735
	/**
736
	 * Test to make sure the 'base location' setting is present in the response.
737
	 * That it is returned as 'select' and not 'single_select_country',
738
	 * and that both state and country options are returned.
739
	 *
740
	 * @since 3.5.0
741
	 */
742
	public function test_woocommerce_default_country() {
743
		wp_set_current_user( $this->user );
744
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/general/woocommerce_default_country' ) );
745
		$setting  = $response->get_data();
746
747
		$this->assertEquals( 'select', $setting['type'] );
748
		$this->assertArrayHasKey( 'GB', $setting['options'] );
749
		$this->assertArrayHasKey( 'US:OR', $setting['options'] );
750
	}
751
752
	/**
753
	 * Test to make sure the store address setting can be fetched and updated.
754
	 *
755
	 * @since 3.5.0
756
	 */
757
	public function test_woocommerce_store_address() {
758
		wp_set_current_user( $this->user );
759
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/general/woocommerce_store_address' ) );
760
		$setting  = $response->get_data();
761
		$this->assertEquals( 'text', $setting['type'] );
762
763
		// Repalce the old value with something uniquely new
764
		$old_value = $setting['value'];
765
		$new_value = $old_value . ' ' . rand( 1000, 9999 );
766
		$request   = new WP_REST_Request( 'PUT', '/wc/v3/settings/general/woocommerce_store_address' );
767
		$request->set_body_params(
768
			array(
769
				'value' => $new_value,
770
			)
771
		);
772
		$response = $this->server->dispatch( $request );
773
		$setting  = $response->get_data();
774
		$this->assertEquals( $new_value, $setting['value'] );
775
776
		// Put the original value back
777
		$request = new WP_REST_Request( 'PUT', '/wc/v3/settings/general/woocommerce_store_address' );
778
		$request->set_body_params(
779
			array(
780
				'value' => $old_value,
781
			)
782
		);
783
		$response = $this->server->dispatch( $request );
784
		$setting  = $response->get_data();
785
		$this->assertEquals( $old_value, $setting['value'] );
786
	}
787
788
	/**
789
	 * Test to make sure the store address 2 (line 2) setting can be fetched and updated.
790
	 *
791
	 * @since 3.5.0
792
	 */
793
	public function test_woocommerce_store_address_2() {
794
		wp_set_current_user( $this->user );
795
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/general/woocommerce_store_address_2' ) );
796
		$setting  = $response->get_data();
797
		$this->assertEquals( 'text', $setting['type'] );
798
799
		// Repalce the old value with something uniquely new
800
		$old_value = $setting['value'];
801
		$new_value = $old_value . ' ' . rand( 1000, 9999 );
802
		$request   = new WP_REST_Request( 'PUT', '/wc/v3/settings/general/woocommerce_store_address_2' );
803
		$request->set_body_params(
804
			array(
805
				'value' => $new_value,
806
			)
807
		);
808
		$response = $this->server->dispatch( $request );
809
		$setting  = $response->get_data();
810
		$this->assertEquals( $new_value, $setting['value'] );
811
812
		// Put the original value back
813
		$request = new WP_REST_Request( 'PUT', '/wc/v3/settings/general/woocommerce_store_address_2' );
814
		$request->set_body_params(
815
			array(
816
				'value' => $old_value,
817
			)
818
		);
819
		$response = $this->server->dispatch( $request );
820
		$setting  = $response->get_data();
821
		$this->assertEquals( $old_value, $setting['value'] );
822
	}
823
824
	/**
825
	 * Test to make sure the store city setting can be fetched and updated.
826
	 *
827
	 * @since 3.5.0
828
	 */
829
	public function test_woocommerce_store_city() {
830
		wp_set_current_user( $this->user );
831
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/general/woocommerce_store_city' ) );
832
		$setting  = $response->get_data();
833
		$this->assertEquals( 'text', $setting['type'] );
834
835
		// Repalce the old value with something uniquely new
836
		$old_value = $setting['value'];
837
		$new_value = $old_value . ' ' . rand( 1000, 9999 );
838
		$request   = new WP_REST_Request( 'PUT', '/wc/v3/settings/general/woocommerce_store_city' );
839
		$request->set_body_params(
840
			array(
841
				'value' => $new_value,
842
			)
843
		);
844
		$response = $this->server->dispatch( $request );
845
		$setting  = $response->get_data();
846
		$this->assertEquals( $new_value, $setting['value'] );
847
848
		// Put the original value back
849
		$request = new WP_REST_Request( 'PUT', '/wc/v3/settings/general/woocommerce_store_city' );
850
		$request->set_body_params(
851
			array(
852
				'value' => $old_value,
853
			)
854
		);
855
		$response = $this->server->dispatch( $request );
856
		$setting  = $response->get_data();
857
		$this->assertEquals( $old_value, $setting['value'] );
858
	}
859
860
	/**
861
	 * Test to make sure the store postcode setting can be fetched and updated.
862
	 *
863
	 * @since 3.5.0
864
	 */
865
	public function test_woocommerce_store_postcode() {
866
		wp_set_current_user( $this->user );
867
		$response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v3/settings/general/woocommerce_store_postcode' ) );
868
		$setting  = $response->get_data();
869
		$this->assertEquals( 'text', $setting['type'] );
870
871
		// Repalce the old value with something uniquely new
872
		$old_value = $setting['value'];
873
		$new_value = $old_value . ' ' . rand( 1000, 9999 );
874
		$request   = new WP_REST_Request( 'PUT', '/wc/v3/settings/general/woocommerce_store_postcode' );
875
		$request->set_body_params(
876
			array(
877
				'value' => $new_value,
878
			)
879
		);
880
		$response = $this->server->dispatch( $request );
881
		$setting  = $response->get_data();
882
		$this->assertEquals( $new_value, $setting['value'] );
883
884
		// Put the original value back
885
		$request = new WP_REST_Request( 'PUT', '/wc/v3/settings/general/woocommerce_store_postcode' );
886
		$request->set_body_params(
887
			array(
888
				'value' => $old_value,
889
			)
890
		);
891
		$response = $this->server->dispatch( $request );
892
		$setting  = $response->get_data();
893
		$this->assertEquals( $old_value, $setting['value'] );
894
	}
895
}
896