Add original cases

This commit is contained in:
Clement Desmidt 2023-04-11 14:07:13 +02:00
parent 63d0b03b50
commit 5de5993e2b
6 changed files with 152 additions and 52 deletions

View File

@ -8,8 +8,7 @@
convertNoticesToExceptions = "true" convertNoticesToExceptions = "true"
convertWarningsToExceptions = "true" convertWarningsToExceptions = "true"
processIsolation = "false" processIsolation = "false"
stopOnFailure = "false" stopOnFailure = "false">
syntaxCheck = "false">
<testsuites> <testsuites>
<testsuite name="Project Test Suite"> <testsuite name="Project Test Suite">
@ -17,12 +16,6 @@
</testsuite> </testsuite>
</testsuites> </testsuites>
<filter>
<whitelist>
<directory suffix=".php">src/</directory>
</whitelist>
</filter>
<php> <php>
<env name="APP_ENV" value="testing"/> <env name="APP_ENV" value="testing"/>
</php> </php>

View File

@ -6,13 +6,12 @@ use DOMDocument;
use DOMElement; use DOMElement;
use Shikiryu\SRSS\Entity\Channel; use Shikiryu\SRSS\Entity\Channel;
use Shikiryu\SRSS\Entity\Item; use Shikiryu\SRSS\Entity\Item;
use Shikiryu\SRSS\Parser\ItemParser;
use Shikiryu\SRSS\SRSS; use Shikiryu\SRSS\SRSS;
use Shikiryu\SRSS\SRSSTools; use Shikiryu\SRSS\SRSSTools;
class SRSSBuilder extends DomDocument class SRSSBuilder extends DomDocument
{ {
public function build(SRSS $srss, string $filepath) private function buildRSS(SRSS $srss)
{ {
$root = $this->createElement('rss'); $root = $this->createElement('rss');
$root->setAttribute('version', '2.0'); $root->setAttribute('version', '2.0');
@ -25,53 +24,27 @@ class SRSSBuilder extends DomDocument
$root->appendChild($channel); $root->appendChild($channel);
$this->appendChild($root); $this->appendChild($root);
$this->encoding = 'UTF-8'; $this->encoding = 'UTF-8';
$this->generator = 'Shikiryu RSS'; $srss->generator = 'Shikiryu RSS';
$this->formatOutput = true; $this->formatOutput = true;
$this->preserveWhiteSpace = false; $this->preserveWhiteSpace = false;
// $docs = 'http://www.scriptol.fr/rss/RSS-2.0.html'; // $docs = 'http://www.scriptol.fr/rss/RSS-2.0.html';
return $this;
}
public function build(SRSS $srss, string $filepath)
{
$this->buildRSS($srss);
$this->save($filepath); $this->save($filepath);
} }
/** /**
* add a SRSS Item as an item into current RSS as first item * @return false|string
*
* @param ItemParser $item
*/ */
public function addItemBefore(ItemParser $item) public function show(SRSS $srss)
{ {
$node = $this->importNode($item->getItem(), true); $this->buildRSS($srss);
$items = $this->getElementsByTagName('item');
if($items->length != 0){
$firstNode = $items->item(0);
if($firstNode != null)
$firstNode->parentNode->insertBefore($node, $firstNode);
else
$this->addItem($item);
}
else
$this->addItem($item);
}
/**
* add a SRSS Item as an item into current RSS
*
* @param ItemParser $item
*/
public function addItem(ItemParser $item)
{
$node = $this->importNode($item->getItem(), true);
$channel = $this->_getChannel();
$channel->appendChild($node);
}
/**
* display XML
* see DomDocument's docs
*/
public function show()
{
// TODO build
return $this->saveXml(); return $this->saveXml();
} }

View File

@ -3,6 +3,7 @@
namespace Shikiryu\SRSS; namespace Shikiryu\SRSS;
use Iterator; use Iterator;
use Shikiryu\SRSS\Builder\SRSSBuilder;
use Shikiryu\SRSS\Entity\Channel; use Shikiryu\SRSS\Entity\Channel;
use Shikiryu\SRSS\Entity\Item; use Shikiryu\SRSS\Entity\Item;
use Shikiryu\SRSS\Exception\SRSSException; use Shikiryu\SRSS\Exception\SRSSException;
@ -118,7 +119,7 @@ class SRSS implements Iterator
/** /**
* current from Iterator * current from Iterator
*/ */
public function current(): mixed public function current(): Item
{ {
return $this->items[$this->position]; return $this->items[$this->position];
} }
@ -202,11 +203,49 @@ class SRSS implements Iterator
$doc['items'][] = $item->toArray(); $doc['items'][] = $item->toArray();
} }
return $doc; return array_filter($doc);
} }
public function addItem(Item $rssItem) /**
* @param \Shikiryu\SRSS\Entity\Item $rssItem
*
* @return array|\Shikiryu\SRSS\Entity\Item[]
*/
public function addItem(Item $rssItem): array
{ {
$this->items[] = $rssItem; $this->items[] = $rssItem;
return $this->items;
} }
/**
* @param \Shikiryu\SRSS\Entity\Item $firstItem
*
* @return array|\Shikiryu\SRSS\Entity\Item[]
*/
public function addItemBefore(Item $firstItem): array
{
array_unshift($this->items, $firstItem);
return $this->items;
}
/**
* @param string $path
*
* @return void
*/
public function save(string $path): void
{
(new SRSSBuilder('1.0', 'UTF-8'))->build($this, $path);
}
/**
* @return false|string
*/
public function show()
{
return (new SRSSBuilder('1.0', 'UTF-8'))->show($this);
}
} }

View File

@ -8,6 +8,14 @@ use Shikiryu\SRSS\SRSSTools;
class BasicBuilderTest extends TestCase class BasicBuilderTest extends TestCase
{ {
private string $saved = __DIR__.'/resources/tmp/build/testCreateBasicRSS.rss';
protected function tearDown(): void
{
parent::tearDown();
if (file_exists($this->saved)) {
unlink($this->saved);
}
}
public function testCreateBasicRSS() public function testCreateBasicRSS()
{ {
$srss = SRSS::create(); $srss = SRSS::create();
@ -31,10 +39,11 @@ class BasicBuilderTest extends TestCase
self::assertTrue($srss->isValid()); self::assertTrue($srss->isValid());
$filepath = __DIR__.'/resources/tmp/build/testCreateBasicRSS.rss';
$builder = new SRSSBuilder(); $builder = new SRSSBuilder();
$builder->build($srss, $filepath); $builder->build($srss, $this->saved);
self::assertFileExists($filepath); self::assertFileExists($this->saved);
self::assertIsString($srss->show());
} }
} }

View File

@ -0,0 +1,41 @@
<?php
use PHPUnit\Framework\TestCase;
use Shikiryu\SRSS\SRSS;
use Shikiryu\SRSS\SRSSTools;
class OriginalReaderSRSSTest extends TestCase
{
private string $original = __DIR__.'/resources/harvard.xml';
private string $saved = __DIR__.'/resources/tmp/build/rss.xml';
protected function tearDown(): void
{
parent::tearDown();
if (file_exists($this->saved)) {
unlink($this->saved);
}
}
public function testOriginalReader()
{
$rss = SRSS::read($this->original);
self::assertEquals('Liftoff News', $rss->title);
$article1 = $rss->getItem(1);
$articleFirst = $rss->getFirst();
self::assertEquals($article1, $articleFirst);
$links = [];
foreach($rss as $article) {
$links[] = sprintf('<a href="%s">%s %s</a>', $article->link, SRSSTools::formatDate('d/m/y', $article->pubDate), $article->title);
}
self::assertCount(4, $links, var_export($links, true));
$rssArray = $rss->toArray();
self::assertCount(11, $rssArray, var_export($rssArray, true)); // 11 elements in RSS
$rss->save($this->saved);
self::assertFileExists($this->saved);
}
}

View File

@ -0,0 +1,45 @@
<?php
use PHPUnit\Framework\TestCase;
use Shikiryu\SRSS\Entity\Item;
use Shikiryu\SRSS\SRSS;
use Shikiryu\SRSS\SRSSTools;
class OriginalWriterSRSSTest extends TestCase
{
public function testOriginalWriter()
{
$rss = SRSS::create();
$rss->title = 'My Awesome Blog';
$rss->link = 'http://shikiryu.com/devblog/';
$rss->description = 'is awesome';
$items = [
['title' => 'title 1', 'link' => 'http://shikiryu.com/devblog/article-1', 'pubDate' => SRSSTools::getRSSDate('2012-03-05 12:02:01'), 'description' => 'description 1'],
['title' => 'title 2', 'link' => 'http://shikiryu.com/devblog/article-2', 'pubDate' => SRSSTools::getRSSDate('2022-03-05 22:02:02'), 'description' => 'description 2'],
['title' => 'title 3', 'link' => 'http://shikiryu.com/devblog/article-3', 'pubDate' => SRSSTools::getRSSDate('2032-03-05 32:02:03'), 'description' => 'description 3'],
['title' => 'title 4', 'link' => 'http://shikiryu.com/devblog/article-4', 'pubDate' => SRSSTools::getRSSDate('2042-03-05 42:02:04'), 'description' => 'description 4'],
];
foreach($items as $item){
$rssitem = new Item();
$rssitem->title = $item["title"];
$rssitem->link = $item['link'];
$rssitem->pubDate = $item["pubDate"];
$rssitem->description = $item["description"];
$rss->addItem($rssitem);
}
$firstItem = new Item();
$firstItem->title = 'title 0';
$firstItem->link = 'http://shikiryu.com/devblog/article-0';
$firstItem->pubDate = SRSSTools::getRSSDate('2011-03-05 12:02:01');
$firstItem->description = 'description 0';
$rss->addItemBefore($firstItem);
self::assertCount(5, $rss->items, var_export($rss->items, true));
self::assertEquals('title 0', $rss->getFirst()->title, var_export($rss->items, true));
self::assertEquals('title 1', $rss->getItem(2)->title, var_export($rss->items, true));
}
}