Actualización

This commit is contained in:
Xes
2025-04-10 12:24:57 +02:00
parent 8969cc929d
commit 45420b6f0d
39760 changed files with 4303286 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
<?php
namespace JeroenDesloovere\VCard;
use PHPUnit\Framework\TestCase;
/*
* This file is part of the VCard PHP Class from Jeroen Desloovere.
*
* For the full copyright and license information, please view the license
* file that was distributed with this source code.
*/
/**
* VCard Exception Test.
*/
final class VCardExceptionTest extends TestCase
{
public function testException()
{
$this->expectException(\JeroenDesloovere\VCard\VCardException::class);
throw new VCardException('Testing the VCard error.');
}
}

View File

@@ -0,0 +1,296 @@
<?php
namespace JeroenDesloovere\VCard\tests;
use JeroenDesloovere\VCard\VCard;
use JeroenDesloovere\VCard\VCardParser;
use OutOfBoundsException;
use PHPUnit\Framework\TestCase;
/**
* Unit tests for our VCard parser.
*/
final class VCardParserTest extends TestCase
{
public function testOutOfRangeException()
{
$this->expectException(OutOfBoundsException::class);
$parser = new VCardParser('');
$parser->getCardAtIndex(2);
}
public function testSimpleVcard()
{
$vcard = new VCard();
$vcard->addName("Desloovere", "Jeroen");
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->firstname, "Jeroen");
$this->assertEquals($parser->getCardAtIndex(0)->lastname, "Desloovere");
$this->assertEquals($parser->getCardAtIndex(0)->fullname, "Jeroen Desloovere");
}
public function testBDay()
{
$vcard = new VCard();
$vcard->addBirthday('31-12-2015');
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->birthday->format('Y-m-d'), '2015-12-31');
}
public function testAddress()
{
$vcard = new VCard();
$vcard->addAddress(
"Lorem Corp.",
"(extended info)",
"54th Ipsum Street",
"PHPsville",
"Guacamole",
"01158",
"Gitland",
'WORK;POSTAL'
);
$vcard->addAddress(
"Jeroen Desloovere",
"(extended info, again)",
"25th Some Address",
"Townsville",
"Area 51",
"045784",
"Europe (is a country, right?)",
'WORK;PERSONAL'
);
$vcard->addAddress(
"Georges Desloovere",
"(extended info, again, again)",
"26th Some Address",
"Townsville-South",
"Area 51B",
"04554",
"Europe (no, it isn't)",
'WORK;PERSONAL'
);
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->address['WORK;POSTAL'][0], (object) array(
'name' => "Lorem Corp.",
'extended' => "(extended info)",
'street' => "54th Ipsum Street",
'city' => "PHPsville",
'region' => "Guacamole",
'zip' => "01158",
'country' => "Gitland",
));
$this->assertEquals($parser->getCardAtIndex(0)->address['WORK;PERSONAL'][0], (object) array(
'name' => "Jeroen Desloovere",
'extended' => "(extended info, again)",
'street' => "25th Some Address",
'city' => "Townsville",
'region' => "Area 51",
'zip' => "045784",
'country' => "Europe (is a country, right?)",
));
$this->assertEquals($parser->getCardAtIndex(0)->address['WORK;PERSONAL'][1], (object) array(
'name' => "Georges Desloovere",
'extended' => "(extended info, again, again)",
'street' => "26th Some Address",
'city' => "Townsville-South",
'region' => "Area 51B",
'zip' => "04554",
'country' => "Europe (no, it isn't)",
));
}
public function testPhone()
{
$vcard = new VCard();
$vcard->addPhoneNumber('0984456123');
$vcard->addPhoneNumber('2015123487', 'WORK');
$vcard->addPhoneNumber('4875446578', 'WORK');
$vcard->addPhoneNumber('9875445464', 'PREF;WORK;VOICE');
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->phone['default'][0], '0984456123');
$this->assertEquals($parser->getCardAtIndex(0)->phone['WORK'][0], '2015123487');
$this->assertEquals($parser->getCardAtIndex(0)->phone['WORK'][1], '4875446578');
$this->assertEquals($parser->getCardAtIndex(0)->phone['PREF;WORK;VOICE'][0], '9875445464');
}
public function testEmail()
{
$vcard = new VCard();
$vcard->addEmail('some@email.com');
$vcard->addEmail('site@corp.net', 'WORK');
$vcard->addEmail('site.corp@corp.net', 'WORK');
$vcard->addEmail('support@info.info', 'PREF;WORK');
$parser = new VCardParser($vcard->buildVCard());
// The VCard class uses a default type of "INTERNET", so we do not test
// against the "default" key.
$this->assertEquals($parser->getCardAtIndex(0)->email['INTERNET'][0], 'some@email.com');
$this->assertEquals($parser->getCardAtIndex(0)->email['INTERNET;WORK'][0], 'site@corp.net');
$this->assertEquals($parser->getCardAtIndex(0)->email['INTERNET;WORK'][1], 'site.corp@corp.net');
$this->assertEquals($parser->getCardAtIndex(0)->email['INTERNET;PREF;WORK'][0], 'support@info.info');
}
public function testOrganization()
{
$vcard = new VCard();
$vcard->addCompany('Lorem Corp.');
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->organization, 'Lorem Corp.');
}
public function testUrl()
{
$vcard = new VCard();
$vcard->addUrl('http://www.jeroendesloovere.be');
$vcard->addUrl('http://home.example.com', 'HOME');
$vcard->addUrl('http://work1.example.com', 'PREF;WORK');
$vcard->addUrl('http://work2.example.com', 'PREF;WORK');
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->url['default'][0], 'http://www.jeroendesloovere.be');
$this->assertEquals($parser->getCardAtIndex(0)->url['HOME'][0], 'http://home.example.com');
$this->assertEquals($parser->getCardAtIndex(0)->url['PREF;WORK'][0], 'http://work1.example.com');
$this->assertEquals($parser->getCardAtIndex(0)->url['PREF;WORK'][1], 'http://work2.example.com');
}
public function testNote()
{
$vcard = new VCard();
$vcard->addNote('This is a testnote');
$parser = new VCardParser($vcard->buildVCard());
$vcardMultiline = new VCard();
$vcardMultiline->addNote("This is a multiline note\nNew line content!\r\nLine 2");
$parserMultiline = new VCardParser($vcardMultiline->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->note, 'This is a testnote');
$this->assertEquals(nl2br($parserMultiline->getCardAtIndex(0)->note), nl2br("This is a multiline note" . PHP_EOL . "New line content!" . PHP_EOL . "Line 2"));
}
public function testCategories()
{
$vcard = new VCard();
$vcard->addCategories([
'Category 1',
'cat-2',
'another long category!'
]);
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->categories[0], 'Category 1');
$this->assertEquals($parser->getCardAtIndex(0)->categories[1], 'cat-2');
$this->assertEquals($parser->getCardAtIndex(0)->categories[2], 'another long category!');
}
public function testTitle()
{
$vcard = new VCard();
$vcard->addJobtitle('Ninja');
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->title, 'Ninja');
}
public function testLogo()
{
$image = __DIR__ . '/image.jpg';
$imageUrl = 'https://raw.githubusercontent.com/jeroendesloovere/vcard/master/tests/image.jpg';
$vcard = new VCard();
$vcard->addLogo($image, true);
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->rawLogo, file_get_contents($image));
$vcard = new VCard();
$vcard->addLogo($image, false);
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->logo, __DIR__ . '/image.jpg');
$vcard = new VCard();
$vcard->addLogo($imageUrl, false);
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->logo, $imageUrl);
}
public function testPhoto()
{
$image = __DIR__ . '/image.jpg';
$imageUrl = 'https://raw.githubusercontent.com/jeroendesloovere/vcard/master/tests/image.jpg';
$vcard = new VCard();
$vcard->addPhoto($image, true);
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->rawPhoto, file_get_contents($image));
$vcard = new VCard();
$vcard->addPhoto($image, false);
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->photo, __DIR__ . '/image.jpg');
$vcard = new VCard();
$vcard->addPhoto($imageUrl, false);
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->photo, $imageUrl);
}
public function testVcardDB()
{
$db = '';
$vcard = new VCard();
$vcard->addName("Desloovere", "Jeroen");
$db .= $vcard->buildVCard();
$vcard = new VCard();
$vcard->addName("Lorem", "Ipsum");
$db .= $vcard->buildVCard();
$parser = new VCardParser($db);
$this->assertEquals($parser->getCardAtIndex(0)->fullname, "Jeroen Desloovere");
$this->assertEquals($parser->getCardAtIndex(1)->fullname, "Ipsum Lorem");
}
public function testIteration()
{
// Prepare a VCard DB.
$db = '';
$vcard = new VCard();
$vcard->addName("Desloovere", "Jeroen");
$db .= $vcard->buildVCard();
$vcard = new VCard();
$vcard->addName("Lorem", "Ipsum");
$db .= $vcard->buildVCard();
$parser = new VCardParser($db);
foreach ($parser as $i => $card) {
$this->assertEquals($card->fullname, $i == 0 ? "Jeroen Desloovere" : "Ipsum Lorem");
}
}
public function testFromFile()
{
$parser = VCardParser::parseFromFile(__DIR__ . '/example.vcf');
// Use this opportunity to test fetching all cards directly.
$cards = $parser->getCards();
$this->assertEquals($cards[0]->firstname, "Jeroen");
$this->assertEquals($cards[0]->lastname, "Desloovere");
$this->assertEquals($cards[0]->fullname, "Jeroen Desloovere");
// Check the parsing of grouped items as well, which are present in the
// example file.
$this->assertEquals($cards[0]->url['default'][0], 'http://www.jeroendesloovere.be');
$this->assertEquals($cards[0]->email['INTERNET'][0], 'site@example.com');
}
public function testFileNotFound()
{
$this->expectException(\RuntimeException::class);
$parser = VCardParser::parseFromFile(__DIR__ . '/does-not-exist.vcf');
}
public function testLabel()
{
$label = 'street, worktown, workpostcode Belgium';
$vcard = new VCard();
$vcard->addLabel($label, 'work');
$parser = new VCardParser($vcard->buildVCard());
$this->assertEquals($parser->getCardAtIndex(0)->label, $label);
}
}

View File

@@ -0,0 +1,466 @@
<?php
namespace JeroenDesloovere\VCard\tests;
// required to load
require_once __DIR__ . '/../vendor/autoload.php';
/*
* This file is part of the VCard PHP Class from Jeroen Desloovere.
*
* For the full copyright and license information, please view the license
* file that was distributed with this source code.
*/
use Exception;
use JeroenDesloovere\VCard\VCard;
use PHPUnit\Framework\TestCase;
/**
* This class will test our VCard PHP Class which can generate VCards.
*/
class VCardTest extends TestCase
{
/**
* @var VCard
*/
protected $vcard = null;
/**
* Data provider for testEmail()
*
* @return array
*/
public function emailDataProvider()
{
return [
[['john@doe.com']],
[['john@doe.com', 'WORK' => 'john@work.com']],
[['WORK' => 'john@work.com', 'HOME' => 'john@home.com']],
[['PREF;WORK' => 'john@work.com', 'HOME' => 'john@home.com']],
];
}
/**
* Set up before class
*
* @return void
*/
protected function setUp(): void
{
// set timezone
date_default_timezone_set('Europe/Brussels');
$this->vcard = new VCard();
$this->firstName = 'Jeroen';
$this->lastName = 'Desloovere';
$this->additional = '&';
$this->prefix = 'Mister';
$this->suffix = 'Junior';
$this->emailAddress1 = '';
$this->emailAddress2 = '';
$this->firstName2 = 'Ali';
$this->lastName2 = 'ÖZSÜT';
$this->firstName3 = 'Garçon';
$this->lastName3 = 'Jéroèn';
}
/**
* Tear down after class
*/
protected function tearDown(): void
{
$this->vcard = null;
}
public function testAddAddress()
{
$this->assertEquals($this->vcard, $this->vcard->addAddress(
'',
'88th Floor',
'555 East Flours Street',
'Los Angeles',
'CA',
'55555',
'USA'
));
$this->assertStringContainsString('ADR;WORK;POSTAL;CHARSET=utf-8:;88th Floor;555 East Flours Street;Los Angele', $this->vcard->getOutput());
// Should fold on row 75, so we should not see the full address.
$this->assertStringNotContainsString('ADR;WORK;POSTAL;CHARSET=utf-8:;88th Floor;555 East Flours Street;Los Angeles;CA;55555;', $this->vcard->getOutput());
}
public function testAddBirthday()
{
$this->assertEquals($this->vcard, $this->vcard->addBirthday(''));
}
public function testAddCompany()
{
$this->assertEquals($this->vcard, $this->vcard->addCompany(''));
}
public function testAddCategories()
{
$this->assertEquals($this->vcard, $this->vcard->addCategories([]));
}
public function testAddEmail()
{
$this->assertEquals($this->vcard, $this->vcard->addEmail($this->emailAddress1));
$this->assertEquals($this->vcard, $this->vcard->addEmail($this->emailAddress2));
$this->assertEquals(2, count($this->vcard->getProperties()));
}
public function testAddJobTitle()
{
$this->assertEquals($this->vcard, $this->vcard->addJobtitle(''));
}
public function testAddRole()
{
$this->assertEquals($this->vcard, $this->vcard->addRole(''));
}
public function testAddName()
{
$this->assertEquals($this->vcard, $this->vcard->addName(''));
}
public function testAddNote()
{
$this->assertEquals($this->vcard, $this->vcard->addNote(''));
}
public function testAddPhoneNumber()
{
$this->assertEquals($this->vcard, $this->vcard->addPhoneNumber(''));
$this->assertEquals($this->vcard, $this->vcard->addPhoneNumber(''));
$this->assertCount(2, $this->vcard->getProperties());
}
public function testAddPhotoWithJpgPhoto()
{
$return = $this->vcard->addPhoto(__DIR__ . '/image.jpg', true);
$this->assertEquals($this->vcard, $return);
}
public function testAddPhotoWithRemoteJpgPhoto()
{
$return = $this->vcard->addPhoto(
'https://raw.githubusercontent.com/jeroendesloovere/vcard/master/tests/image.jpg',
true
);
$this->assertEquals($this->vcard, $return);
}
/**
* Test adding remote empty photo
*/
public function testAddPhotoWithRemoteEmptyJpgPhoto()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Returned data is not an image.');
$this->vcard->addPhoto(
'https://raw.githubusercontent.com/jeroendesloovere/vcard/master/tests/empty.jpg',
true
);
}
public function testAddPhotoContentWithJpgPhoto()
{
$return = $this->vcard->addPhotoContent(file_get_contents(__DIR__ . '/image.jpg'));
$this->assertEquals($this->vcard, $return);
}
/**
* Test adding empty photo
*/
public function testAddPhotoContentWithEmptyContent()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Returned data is not an image.');
$this->vcard->addPhotoContent('');
}
public function testAddLogoWithJpgImage()
{
$return = $this->vcard->addLogo(__DIR__ . '/image.jpg', true);
$this->assertEquals($this->vcard, $return);
}
public function testAddLogoWithJpgImageNoInclude()
{
$return = $this->vcard->addLogo(__DIR__ . '/image.jpg', false);
$this->assertEquals($this->vcard, $return);
}
public function testAddLogoContentWithJpgImage()
{
$return = $this->vcard->addLogoContent(file_get_contents(__DIR__ . '/image.jpg'));
$this->assertEquals($this->vcard, $return);
}
/**
* Test adding empty photo
*/
public function testAddLogoContentWithEmptyContent()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Returned data is not an image.');
$this->vcard->addLogoContent('');
}
public function testAddUrl()
{
$this->assertEquals($this->vcard, $this->vcard->addUrl('1'));
$this->assertEquals($this->vcard, $this->vcard->addUrl('2'));
$this->assertCount(2, $this->vcard->getProperties());
}
/**
* Test adding local photo using an empty file
*/
public function testAddPhotoWithEmptyFile()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Returned data is not an image.');
$this->vcard->addPhoto(__DIR__ . '/emptyfile', true);
}
/**
* Test adding logo with no value
*/
public function testAddLogoWithNoValue()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Returned data is not an image.');
$this->vcard->addLogo(__DIR__ . '/emptyfile', true);
}
/**
* Test adding photo with no photo
*/
public function testAddPhotoWithNoPhoto()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Returned data is not an image.');
$this->vcard->addPhoto(__DIR__ . '/wrongfile', true);
}
/**
* Test adding logo with no image
*/
public function testAddLogoWithNoImage()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Returned data is not an image.');
$this->vcard->addLogo(__DIR__ . '/wrongfile', true);
}
/**
* Test charset
*/
public function testCharset()
{
$charset = 'ISO-8859-1';
$this->vcard->setCharset($charset);
$this->assertEquals($charset, $this->vcard->getCharset());
}
/**
* Test Email
*
* @dataProvider emailDataProvider $emails
*/
public function testEmail($emails = [])
{
foreach ($emails as $key => $email) {
if (is_string($key)) {
$this->vcard->addEmail($email, $key);
} else {
$this->vcard->addEmail($email);
}
}
foreach ($emails as $key => $email) {
if (is_string($key)) {
$this->assertStringContainsString('EMAIL;INTERNET;' . $key . ':' . $email, $this->vcard->getOutput());
} else {
$this->assertStringContainsString('EMAIL;INTERNET:' . $email, $this->vcard->getOutput());
}
}
}
/**
* Test first name and last name
*/
public function testFirstNameAndLastName()
{
$this->vcard->addName(
$this->lastName,
$this->firstName
);
$this->assertEquals('jeroen-desloovere', $this->vcard->getFilename());
}
/**
* Test full blown name
*/
public function testFullBlownName()
{
$this->vcard->addName(
$this->lastName,
$this->firstName,
$this->additional,
$this->prefix,
$this->suffix
);
$this->assertEquals('mister-jeroen-desloovere-junior', $this->vcard->getFilename());
}
/**
* Test multiple birthdays
*/
public function testMultipleBirthdays()
{
$this->expectException(\Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addBirthday('1'));
$this->expectException(Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addBirthday('2'));
}
/**
* Test multiple categories
*/
public function testMultipleCategories()
{
$this->expectException(\Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addCategories(['1']));
$this->expectException(Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addCategories(['2']));
}
/**
* Test multiple companies
*/
public function testMultipleCompanies()
{
$this->expectException(\Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addCompany('1'));
$this->expectException(Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addCompany('2'));
}
/**
* Test multiple job titles
*/
public function testMultipleJobtitles()
{
$this->expectException(\Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addJobtitle('1'));
$this->expectException(Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addJobtitle('2'));
}
/**
* Test multiple roles
*/
public function testMultipleRoles()
{
$this->expectException(\Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addRole('1'));
$this->expectException(Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addRole('2'));
}
/**
* Test multiple names
*/
public function testMultipleNames()
{
$this->expectException(\Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addName('1'));
$this->expectException(Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addName('2'));
}
/**
* Test multiple notes
*/
public function testMultipleNotes()
{
$this->expectException(\Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addNote('1'));
$this->expectException(Exception::class);
$this->assertEquals($this->vcard, $this->vcard->addNote('2'));
}
/**
* Test special first name and last name
*/
public function testSpecialFirstNameAndLastName()
{
$this->vcard->addName(
$this->lastName2,
$this->firstName2
);
$this->assertEquals('ali-ozsut', $this->vcard->getFilename());
}
/**
* Test special first name and last name
*/
public function testSpecialFirstNameAndLastName2()
{
$this->vcard->addName(
$this->lastName3,
$this->firstName3
);
$this->assertEquals('garcon-jeroen', $this->vcard->getFilename());
}
/**
* Test multiple labels
*/
public function testMultipleLabels()
{
$this->assertSame($this->vcard, $this->vcard->addLabel('My label'));
$this->assertSame($this->vcard, $this->vcard->addLabel('My work label', 'WORK'));
$this->assertSame(2, count($this->vcard->getProperties()));
$this->assertStringContainsString('LABEL;CHARSET=utf-8:My label', $this->vcard->getOutput());
$this->assertStringContainsString('LABEL;WORK;CHARSET=utf-8:My work label', $this->vcard->getOutput());
}
public function testChunkSplitUnicode()
{
$class_handler = new \ReflectionClass('JeroenDesloovere\VCard\VCard');
$method_handler = $class_handler->getMethod('chunk_split_unicode');
$method_handler->setAccessible(true);
$ascii_input="Lorem ipsum dolor sit amet,";
$ascii_output = $method_handler->invokeArgs(new VCard(), [$ascii_input,10,'|']);
$unicode_input='Τη γλώσσα μου έδωσαν ελληνική το σπίτι φτωχικό στις αμμουδιές του Ομήρου.';
$unicode_output = $method_handler->invokeArgs(new VCard(), [$unicode_input,10,'|']);
$this->assertEquals(
"Lorem ipsu|m dolor si|t amet,|",
$ascii_output);
$this->assertEquals(
"Τη γλώσσα |μου έδωσαν| ελληνική |το σπίτι φ|τωχικό στι|ς αμμουδιέ|ς του Ομήρ|ου.|",
$unicode_output);
}
}

View File

View File

View File

@@ -0,0 +1,10 @@
BEGIN:VCARD
VERSION:3.0
REV:2016-05-30T10:36:13Z
N;CHARSET=utf-8:Desloovere;Jeroen;;;
FN;CHARSET=utf-8:Jeroen Desloovere
item1.EMAIL;type=INTERNET:site@example.com
item1.X-ABLabel:$!<Email>!$
item2.URL:http://www.jeroendesloovere.be
item2.X-ABLabel:$!<Home>!$
END:VCARD

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

View File

@@ -0,0 +1 @@
foobar