Skip to content
Prev Previous commit
Next Next commit
Smaller config in test
  • Loading branch information
sirreal committed May 9, 2024
commit 76c7a5e594d471593873ed828fd36ae96cde60e3
77 changes: 73 additions & 4 deletions tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@ public function set_up() {
$this->interactivity = new WP_Interactivity_API();
}

/**
* Tear down.
*/
public function tear_down() {
remove_filter( 'pre_option_blog_charset', array( $this, 'charset_iso_8859_1' ) );
}

public function charset_iso_8859_1() {
return 'iso-8859-1';
}

/**
* Tests that the state and config methods return an empty array at the
* beginning.
Expand Down Expand Up @@ -349,20 +360,78 @@ public function test_config_printed_correctly_with_nested_empty_array() {
* properly escaped.
*
* @ticket 60356
* @ticket 61170
*
* @covers ::state
* @covers ::config
* @covers ::print_client_interactivity_data
*/
public function test_state_and_config_escape_special_characters() {
$this->interactivity->state( 'myPlugin', array( 'amps' => 'http://site.test/?foo=1&baz=2' ) );
$this->interactivity->config( 'myPlugin', array( 'tags' => 'Tags: <!-- <script>' ) );
$this->interactivity->state(
'myPlugin',
array(
'ampersand' => '&',
'less-than sign' => '<',
'greater-than sign' => '>',
'solidus' => '/',
'line separator' => "\u{2028}",
'paragraph separator' => "\u{2029}",
'flag of england' => "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}",
'malicious script closer' => '</script>',
'entity-encoded malicious script closer' => '&lt;/script&gt;',
),
);
$this->interactivity->config( 'myPlugin', array( 'chars' => '&<>/' ) );

$interactivity_data_markup = get_echo( array( $this->interactivity, 'print_client_interactivity_data' ) );
preg_match( '/<script type="application\/json" id="wp-interactivity-data">.*?(\{.*\}).*?<\/script>/s', $interactivity_data_markup, $interactivity_data_string );
preg_match( '~<script type="application/json" id="wp-interactivity-data">\s*(\{.*\})\s*</script>~s', $interactivity_data_markup, $interactivity_data_string );

$this->assertEquals(
<<<"JSON"
{"config":{"myPlugin":{"chars":"&\\u003C\\u003E/"}},"state":{"myPlugin":{"ampersand":"&","less-than sign":"\\u003C","greater-than sign":"\\u003E","solidus":"/","line separator":"\u{2028}","paragraph separator":"\u{2029}","flag of england":"\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}","malicious script closer":"\\u003C/script\\u003E","entity-encoded malicious script closer":"&lt;/script&gt;"}}}
JSON,
$interactivity_data_string[1]
);
}

/**
* Tests that special characters in the initial state and configuration are
* properly escaped when the blog_charset is not UTF-8 (unicode compatible).
*
* This this test, unicode and line terminators should be escaped to their
* JSON unicode sequences.
*
* @ticket 61170
*
* @covers ::state
* @covers ::config
* @covers ::print_client_interactivity_data
*/
public function test_state_and_config_escape_special_characters_non_utf8() {
add_filter( 'pre_option_blog_charset', array( $this, 'charset_iso_8859_1' ) );
$this->interactivity->state(
'myPlugin',
array(
'ampersand' => '&',
'less-than sign' => '<',
'greater-than sign' => '>',
'solidus' => '/',
'line separator' => "\u{2028}",
'paragraph separator' => "\u{2029}",
'flag of england' => "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}",
'malicious script closer' => '</script>',
'entity-encoded malicious script closer' => '&lt;/script&gt;',
),
);
$this->interactivity->config( 'myPlugin', array( 'chars' => '&<>/' ) );

$interactivity_data_markup = get_echo( array( $this->interactivity, 'print_client_interactivity_data' ) );
preg_match( '~<script type="application/json" id="wp-interactivity-data">\s*(\{.*\})\s*</script>~s', $interactivity_data_markup, $interactivity_data_string );

$this->assertEquals(
'{"config":{"myPlugin":{"tags":"Tags: \u003C!-- \u003Cscript\u003E"}},"state":{"myPlugin":{"amps":"http:\/\/site.test\/?foo=1\u0026baz=2"}}}',
<<<"JSON"
{"config":{"myPlugin":{"chars":"&\\u003C\\u003E/"}},"state":{"myPlugin":{"ampersand":"&","less-than sign":"\\u003C","greater-than sign":"\\u003E","solidus":"/","line separator":"\\u2028","paragraph separator":"\\u2029","flag of england":"\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f","malicious script closer":"\\u003C/script\\u003E","entity-encoded malicious script closer":"&lt;/script&gt;"}}}
JSON,
$interactivity_data_string[1]
);
}
Expand Down