7
|
1 <?php
|
|
2
|
|
3 namespace Sabre\VObject\Component;
|
|
4
|
|
5 use Sabre\VObject;
|
|
6
|
|
7 class VCardTest extends \PHPUnit_Framework_TestCase {
|
|
8
|
|
9 /**
|
|
10 * @dataProvider validateData
|
|
11 */
|
|
12 function testValidate($input, $expectedWarnings, $expectedRepairedOutput) {
|
|
13
|
|
14 $vcard = VObject\Reader::read($input);
|
|
15
|
|
16 $warnings = $vcard->validate();
|
|
17
|
|
18 $warnMsg = array();
|
|
19 foreach($warnings as $warning) {
|
|
20 $warnMsg[] = $warning['message'];
|
|
21 }
|
|
22
|
|
23 $this->assertEquals($expectedWarnings, $warnMsg);
|
|
24
|
|
25 $vcard->validate(VObject\Component::REPAIR);
|
|
26
|
|
27 $this->assertEquals(
|
|
28 $expectedRepairedOutput,
|
|
29 $vcard->serialize()
|
|
30 );
|
|
31
|
|
32 }
|
|
33
|
|
34 public function validateData() {
|
|
35
|
|
36 $tests = array();
|
|
37
|
|
38 // Correct
|
|
39 $tests[] = array(
|
|
40 "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
|
|
41 array(),
|
|
42 "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
|
|
43 );
|
|
44
|
|
45 // No VERSION
|
|
46 $tests[] = array(
|
|
47 "BEGIN:VCARD\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
|
|
48 array(
|
|
49 'VERSION MUST appear exactly once in a VCARD component',
|
|
50 ),
|
|
51 "BEGIN:VCARD\r\nVERSION:3.0\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
|
|
52 );
|
|
53
|
|
54 // Unknown version
|
|
55 $tests[] = array(
|
|
56 "BEGIN:VCARD\r\nVERSION:2.2\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
|
|
57 array(
|
|
58 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.',
|
|
59 ),
|
|
60 "BEGIN:VCARD\r\nVERSION:2.1\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
|
|
61 );
|
|
62
|
|
63 // No FN
|
|
64 $tests[] = array(
|
|
65 "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nEND:VCARD\r\n",
|
|
66 array(
|
|
67 'The FN property must appear in the VCARD component exactly 1 time',
|
|
68 ),
|
|
69 "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nEND:VCARD\r\n",
|
|
70 );
|
|
71 // No FN, N fallback
|
|
72 $tests[] = array(
|
|
73 "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;John;;;;;\r\nEND:VCARD\r\n",
|
|
74 array(
|
|
75 'The FN property must appear in the VCARD component exactly 1 time',
|
|
76 ),
|
|
77 "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;John;;;;;\r\nFN:John Doe\r\nEND:VCARD\r\n",
|
|
78 );
|
|
79 // No FN, N fallback, no first name
|
|
80 $tests[] = array(
|
|
81 "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;;;;;;\r\nEND:VCARD\r\n",
|
|
82 array(
|
|
83 'The FN property must appear in the VCARD component exactly 1 time',
|
|
84 ),
|
|
85 "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;;;;;;\r\nFN:Doe\r\nEND:VCARD\r\n",
|
|
86 );
|
|
87
|
|
88 // No FN, ORG fallback
|
|
89 $tests[] = array(
|
|
90 "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nORG:Acme Co.\r\nEND:VCARD\r\n",
|
|
91 array(
|
|
92 'The FN property must appear in the VCARD component exactly 1 time',
|
|
93 ),
|
|
94 "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nORG:Acme Co.\r\nFN:Acme Co.\r\nEND:VCARD\r\n",
|
|
95 );
|
|
96 return $tests;
|
|
97
|
|
98 }
|
|
99
|
|
100 function testGetDocumentType() {
|
|
101
|
|
102 $vcard = new VCard(array(), false);
|
|
103 $vcard->VERSION = '2.1';
|
|
104 $this->assertEquals(VCard::VCARD21, $vcard->getDocumentType());
|
|
105
|
|
106 $vcard = new VCard(array(), false);
|
|
107 $vcard->VERSION = '3.0';
|
|
108 $this->assertEquals(VCard::VCARD30, $vcard->getDocumentType());
|
|
109
|
|
110 $vcard = new VCard(array(), false);
|
|
111 $vcard->VERSION = '4.0';
|
|
112 $this->assertEquals(VCard::VCARD40, $vcard->getDocumentType());
|
|
113
|
|
114 $vcard = new VCard(array(), false);
|
|
115 $this->assertEquals(VCard::UNKNOWN, $vcard->getDocumentType());
|
|
116 }
|
|
117
|
|
118 function testPreferredNoPref() {
|
|
119
|
|
120 $vcard = <<<VCF
|
|
121 BEGIN:VCARD
|
|
122 VERSION:3.0
|
|
123 EMAIL:1@example.org
|
|
124 EMAIL:2@example.org
|
|
125 END:VCARD
|
|
126 VCF;
|
|
127
|
|
128 $vcard = VObject\Reader::read($vcard);
|
|
129 $this->assertEquals('1@example.org', $vcard->preferred('EMAIL')->getValue());
|
|
130
|
|
131 }
|
|
132
|
|
133 function testPreferredWithPref() {
|
|
134
|
|
135 $vcard = <<<VCF
|
|
136 BEGIN:VCARD
|
|
137 VERSION:3.0
|
|
138 EMAIL:1@example.org
|
|
139 EMAIL;TYPE=PREF:2@example.org
|
|
140 END:VCARD
|
|
141 VCF;
|
|
142
|
|
143 $vcard = VObject\Reader::read($vcard);
|
|
144 $this->assertEquals('2@example.org', $vcard->preferred('EMAIL')->getValue());
|
|
145
|
|
146 }
|
|
147
|
|
148 function testPreferredWith40Pref() {
|
|
149
|
|
150 $vcard = <<<VCF
|
|
151 BEGIN:VCARD
|
|
152 VERSION:4.0
|
|
153 EMAIL:1@example.org
|
|
154 EMAIL;PREF=3:2@example.org
|
|
155 EMAIL;PREF=2:3@example.org
|
|
156 END:VCARD
|
|
157 VCF;
|
|
158
|
|
159 $vcard = VObject\Reader::read($vcard);
|
|
160 $this->assertEquals('3@example.org', $vcard->preferred('EMAIL')->getValue());
|
|
161
|
|
162 }
|
|
163
|
|
164 function testPreferredNotFound() {
|
|
165
|
|
166 $vcard = <<<VCF
|
|
167 BEGIN:VCARD
|
|
168 VERSION:4.0
|
|
169 END:VCARD
|
|
170 VCF;
|
|
171
|
|
172 $vcard = VObject\Reader::read($vcard);
|
|
173 $this->assertNull($vcard->preferred('EMAIL'));
|
|
174
|
|
175 }
|
|
176
|
|
177 function testNoUIDCardDAV() {
|
|
178
|
|
179 $vcard = <<<VCF
|
|
180 BEGIN:VCARD
|
|
181 VERSION:4.0
|
|
182 FN:John Doe
|
|
183 END:VCARD
|
|
184 VCF;
|
|
185 $this->assertValidate(
|
|
186 $vcard,
|
|
187 VCARD::PROFILE_CARDDAV,
|
|
188 3,
|
|
189 'vCards on CardDAV servers MUST have a UID property.'
|
|
190 );
|
|
191
|
|
192 }
|
|
193
|
|
194 function testNoUIDNoCardDAV() {
|
|
195
|
|
196 $vcard = <<<VCF
|
|
197 BEGIN:VCARD
|
|
198 VERSION:4.0
|
|
199 FN:John Doe
|
|
200 END:VCARD
|
|
201 VCF;
|
|
202 $this->assertValidate(
|
|
203 $vcard,
|
|
204 0,
|
|
205 2,
|
|
206 'Adding a UID to a vCard property is recommended.'
|
|
207 );
|
|
208
|
|
209 }
|
|
210 function testNoUIDNoCardDAVRepair() {
|
|
211
|
|
212 $vcard = <<<VCF
|
|
213 BEGIN:VCARD
|
|
214 VERSION:4.0
|
|
215 FN:John Doe
|
|
216 END:VCARD
|
|
217 VCF;
|
|
218 $this->assertValidate(
|
|
219 $vcard,
|
|
220 VCARD::REPAIR,
|
|
221 1,
|
|
222 'Adding a UID to a vCard property is recommended.'
|
|
223 );
|
|
224
|
|
225 }
|
|
226
|
|
227 function testVCard21CardDAV() {
|
|
228
|
|
229 $vcard = <<<VCF
|
|
230 BEGIN:VCARD
|
|
231 VERSION:2.1
|
|
232 FN:John Doe
|
|
233 UID:foo
|
|
234 END:VCARD
|
|
235 VCF;
|
|
236 $this->assertValidate(
|
|
237 $vcard,
|
|
238 VCARD::PROFILE_CARDDAV,
|
|
239 3,
|
|
240 'CardDAV servers are not allowed to accept vCard 2.1.'
|
|
241 );
|
|
242
|
|
243 }
|
|
244
|
|
245 function testVCard21NoCardDAV() {
|
|
246
|
|
247 $vcard = <<<VCF
|
|
248 BEGIN:VCARD
|
|
249 VERSION:2.1
|
|
250 FN:John Doe
|
|
251 UID:foo
|
|
252 END:VCARD
|
|
253 VCF;
|
|
254 $this->assertValidate(
|
|
255 $vcard,
|
|
256 0,
|
|
257 0
|
|
258 );
|
|
259
|
|
260 }
|
|
261
|
|
262 function assertValidate($vcf, $options, $expectedLevel, $expectedMessage = null) {
|
|
263
|
|
264 $vcal = VObject\Reader::read($vcf);
|
|
265 $result = $vcal->validate($options);
|
|
266
|
|
267 $this->assertValidateResult($result, $expectedLevel, $expectedMessage);
|
|
268
|
|
269 }
|
|
270
|
|
271 function assertValidateResult($input, $expectedLevel, $expectedMessage = null) {
|
|
272
|
|
273 $messages = array();
|
|
274 foreach($input as $warning) {
|
|
275 $messages[] = $warning['message'];
|
|
276 }
|
|
277
|
|
278 if ($expectedLevel === 0) {
|
|
279 $this->assertEquals(0, count($input), 'No validation messages were expected. We got: ' . implode(', ', $messages));
|
|
280 } else {
|
|
281 $this->assertEquals(1, count($input), 'We expected exactly 1 validation message, We got: ' . implode(', ', $messages));
|
|
282
|
|
283 $this->assertEquals($expectedMessage, $input[0]['message']);
|
|
284 $this->assertEquals($expectedLevel, $input[0]['level']);
|
|
285 }
|
|
286
|
|
287 }
|
|
288 }
|