Chris@18
|
1 <?php
|
Chris@18
|
2
|
Chris@18
|
3 namespace Drupal\Tests\jsonapi\Unit;
|
Chris@18
|
4
|
Chris@18
|
5 use Drupal\jsonapi\JsonApiSpec;
|
Chris@18
|
6 use Drupal\Tests\UnitTestCase;
|
Chris@18
|
7
|
Chris@18
|
8 /**
|
Chris@18
|
9 * @coversDefaultClass \Drupal\jsonapi\JsonApiSpec
|
Chris@18
|
10 * @group jsonapi
|
Chris@18
|
11 *
|
Chris@18
|
12 * @internal
|
Chris@18
|
13 */
|
Chris@18
|
14 class JsonApiSpecTest extends UnitTestCase {
|
Chris@18
|
15
|
Chris@18
|
16 /**
|
Chris@18
|
17 * Ensures that member names are properly validated.
|
Chris@18
|
18 *
|
Chris@18
|
19 * @dataProvider providerTestIsValidMemberName
|
Chris@18
|
20 * @covers ::isValidMemberName
|
Chris@18
|
21 */
|
Chris@18
|
22 public function testIsValidMemberName($member_name, $expected) {
|
Chris@18
|
23 $this->assertSame($expected, JsonApiSpec::isValidMemberName($member_name));
|
Chris@18
|
24 }
|
Chris@18
|
25
|
Chris@18
|
26 /**
|
Chris@18
|
27 * Data provider for testIsValidMemberName.
|
Chris@18
|
28 */
|
Chris@18
|
29 public function providerTestIsValidMemberName() {
|
Chris@18
|
30 // Copied from http://jsonapi.org/format/upcoming/#document-member-names.
|
Chris@18
|
31 $data = [];
|
Chris@18
|
32 $data['alphanumeric-lowercase'] = ['12kittens', TRUE];
|
Chris@18
|
33 $data['alphanumeric-uppercase'] = ['12KITTENS', TRUE];
|
Chris@18
|
34 $data['alphanumeric-mixed'] = ['12KiTtEnS', TRUE];
|
Chris@18
|
35 $data['unicode-above-u+0080'] = ['12🐱🐱', TRUE];
|
Chris@18
|
36 $data['hyphen-start'] = ['-kittens', FALSE];
|
Chris@18
|
37 $data['hyphen-middle'] = ['kitt-ens', TRUE];
|
Chris@18
|
38 $data['hyphen-end'] = ['kittens-', FALSE];
|
Chris@18
|
39 $data['lowline-start'] = ['_kittens', FALSE];
|
Chris@18
|
40 $data['lowline-middle'] = ['kitt_ens', TRUE];
|
Chris@18
|
41 $data['lowline-end'] = ['kittens_', FALSE];
|
Chris@18
|
42 $data['space-start'] = [' kittens', FALSE];
|
Chris@18
|
43 $data['space-middle'] = ['kitt ens', TRUE];
|
Chris@18
|
44 $data['space-end'] = ['kittens ', FALSE];
|
Chris@18
|
45
|
Chris@18
|
46 // Additional test cases.
|
Chris@18
|
47 // @todo When D8 requires PHP >= 7, convert to \u{10FFFF}.
|
Chris@18
|
48 $data['unicode-above-u+0080-highest-allowed'] = ["12", TRUE];
|
Chris@18
|
49 $data['single-character'] = ['a', TRUE];
|
Chris@18
|
50
|
Chris@18
|
51 $unsafe_chars = [
|
Chris@18
|
52 '+',
|
Chris@18
|
53 ',',
|
Chris@18
|
54 '.',
|
Chris@18
|
55 '[',
|
Chris@18
|
56 ']',
|
Chris@18
|
57 '!',
|
Chris@18
|
58 '"',
|
Chris@18
|
59 '#',
|
Chris@18
|
60 '$',
|
Chris@18
|
61 '%',
|
Chris@18
|
62 '&',
|
Chris@18
|
63 '\'',
|
Chris@18
|
64 '(',
|
Chris@18
|
65 ')',
|
Chris@18
|
66 '*',
|
Chris@18
|
67 '/',
|
Chris@18
|
68 ':',
|
Chris@18
|
69 ';',
|
Chris@18
|
70 '<',
|
Chris@18
|
71 '=',
|
Chris@18
|
72 '>',
|
Chris@18
|
73 '?',
|
Chris@18
|
74 '@',
|
Chris@18
|
75 '\\',
|
Chris@18
|
76 '^',
|
Chris@18
|
77 '`',
|
Chris@18
|
78 '{',
|
Chris@18
|
79 '|',
|
Chris@18
|
80 '}',
|
Chris@18
|
81 '~',
|
Chris@18
|
82 ];
|
Chris@18
|
83 foreach ($unsafe_chars as $unsafe_char) {
|
Chris@18
|
84 $data['unsafe-' . $unsafe_char] = ['kitt' . $unsafe_char . 'ens', FALSE];
|
Chris@18
|
85 }
|
Chris@18
|
86
|
Chris@18
|
87 // The ASCII control characters are in the range 0x00 to 0x1F plus 0x7F.
|
Chris@18
|
88 for ($ascii = 0; $ascii <= 0x1F; $ascii++) {
|
Chris@18
|
89 $data['unsafe-ascii-control-' . $ascii] = ['kitt' . chr($ascii) . 'ens', FALSE];
|
Chris@18
|
90 }
|
Chris@18
|
91 $data['unsafe-ascii-control-' . 0x7F] = ['kitt' . chr(0x7F) . 'ens', FALSE];
|
Chris@18
|
92
|
Chris@18
|
93 return $data;
|
Chris@18
|
94 }
|
Chris@18
|
95
|
Chris@18
|
96 /**
|
Chris@18
|
97 * Provides test cases.
|
Chris@18
|
98 *
|
Chris@18
|
99 * @dataProvider providerTestIsValidCustomQueryParameter
|
Chris@18
|
100 * @covers ::isValidCustomQueryParameter
|
Chris@18
|
101 * @covers ::isValidMemberName
|
Chris@18
|
102 */
|
Chris@18
|
103 public function testIsValidCustomQueryParameter($custom_query_parameter, $expected) {
|
Chris@18
|
104 $this->assertSame($expected, JsonApiSpec::isValidCustomQueryParameter($custom_query_parameter));
|
Chris@18
|
105 }
|
Chris@18
|
106
|
Chris@18
|
107 /**
|
Chris@18
|
108 * Data provider for testIsValidCustomQueryParameter.
|
Chris@18
|
109 */
|
Chris@18
|
110 public function providerTestIsValidCustomQueryParameter() {
|
Chris@18
|
111 $data = $this->providerTestIsValidMemberName();
|
Chris@18
|
112
|
Chris@18
|
113 // All valid member names are also valid custom query parameters, except for
|
Chris@18
|
114 // single-character ones.
|
Chris@18
|
115 $data['single-character'][1] = FALSE;
|
Chris@18
|
116
|
Chris@18
|
117 // Custom query parameter test cases.
|
Chris@18
|
118 $data['custom-query-parameter-lowercase'] = ['foobar', FALSE];
|
Chris@18
|
119 $data['custom-query-parameter-dash'] = ['foo-bar', TRUE];
|
Chris@18
|
120 $data['custom-query-parameter-underscore'] = ['foo_bar', TRUE];
|
Chris@18
|
121 $data['custom-query-parameter-camelcase'] = ['fooBar', TRUE];
|
Chris@18
|
122
|
Chris@18
|
123 return $data;
|
Chris@18
|
124 }
|
Chris@18
|
125
|
Chris@18
|
126 }
|