Remove PHPunit integration tests

Signed-off-by: Sean Molenaar <sean@seanmolenaar.eu>
This commit is contained in:
Sean Molenaar 2020-12-26 13:09:41 +01:00 committed by Sean Molenaar
parent 0f1731833f
commit 27bd540580
13 changed files with 3 additions and 1069 deletions

View File

@ -135,9 +135,6 @@ jobs:
- name: Prep PHP tests
working-directory: ../server/apps/news
run: make php-test-dependencies
- name: Integration tests
working-directory: ../server/apps/news
run: make integration-test
- name: Feed tests
working-directory: ../server/apps/news
run: make feed-test

View File

@ -7,6 +7,9 @@ The format is almost based on [Keep a Changelog](https://keepachangelog.com/en/1
## [15.1.1] - 2020-12-27
### Changed
- Remove PHPunit based integration tests
### Fixed
- Argument 2 passed to OCA\News\Db\FeedMapper::find() must be of the type int, string given #996

View File

@ -194,18 +194,12 @@ php-test-dependencies:
unit-test:
./vendor/phpunit/phpunit/phpunit -c phpunit.xml --coverage-clover build/php-unit.clover
# \Test\TestCase is only allowed to access the db if TRAVIS environment variable is set
.PHONY: integration-test
integration-test:
env TRAVIS=1 ./vendor/phpunit/phpunit/phpunit -c phpunit.integration.xml
# Command for running JS and PHP tests. Works for package.json files in the js/
# and root directory. If phpunit is not installed systemwide, a copy is fetched
# from the internet
.PHONY: test
test: php-test-dependencies
$(MAKE) unit-test
$(MAKE) integration-test
$(MAKE) phpcs
$(MAKE) phpstan
$(MAKE) js-test

View File

@ -1,7 +0,0 @@
<phpunit bootstrap="tests/bootstrap.php" colors="true">
<testsuites>
<testsuite name="integration">
<directory>./tests/Integration</directory>
</testsuite>
</testsuites>
</phpunit>

View File

@ -1,258 +0,0 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @author Daniel Opitz <dev@copynpaste.de>
* @copyright Bernhard Posselt 2015
* @copyright Daniel Opitz 2017
*/
namespace OCA\News\Tests\Integration\Db;
use OCA\News\Db\Feed;
use OCA\News\Tests\Integration\IntegrationTest;
use OCA\News\Tests\Integration\Fixtures\FeedFixture;
class FeedMapperTest extends IntegrationTest
{
public function testFind()
{
$feed = new FeedFixture();
$feed = $this->feedMapper->insert($feed);
$fetched = $this->feedMapper->find($this->user, $feed->getId());
$this->assertInstanceOf(Feed::class, $fetched);
$this->assertEquals($feed->getLink(), $fetched->getLink());
}
public function testFindNotExisting()
{
$this->expectException('OCP\AppFramework\Db\DoesNotExistException');
$this->feedMapper->find($this->user, 0);
}
public function testFindAll()
{
$feeds = [
[
'userId' => $this->user,
'items' => []
],
[
'userId' => 'john',
'items' => []
]
];
$this->loadFeedFixtures($feeds);
$fetched = $this->feedMapper->findAll();
$this->assertIsArray($fetched);
$this->assertCount(2, $fetched);
$this->assertContainsOnlyInstancesOf(Feed::class, $fetched);
$this->tearDownUser('john');
}
public function testFindAllEmpty()
{
$feeds = $this->feedMapper->findAll();
$this->assertIsArray($feeds);
$this->assertCount(0, $feeds);
}
public function testFindAllFromUser()
{
$feeds = [
[
'userId' => $this->user,
'items' => []
],
[
'userId' => 'john',
'items' => []
]
];
$this->loadFeedFixtures($feeds);
$fetched = $this->feedMapper->findAllFromUser($this->user);
$this->assertIsArray($fetched);
$this->assertCount(1, $fetched);
$this->assertContainsOnlyInstancesOf(Feed::class, $fetched);
$this->tearDownUser('john');
}
public function testFindAllFromUserNotExisting()
{
$fetched = $this->feedMapper->findAllFromUser('notexistinguser');
$this->assertIsArray($fetched);
$this->assertCount(0, $fetched);
}
public function testFindByUrlHash()
{
$feed = new FeedFixture(
[
'urlHash' => 'someTestHash',
'title' => 'Some Test Title'
]
);
$feed = $this->feedMapper->insert($feed);
$fetched = $this->feedMapper->findByUrlHash($feed->getUrlHash(), $this->user);
$this->assertInstanceOf(Feed::class, $fetched);
$this->assertEquals($feed->getTitle(), $fetched->getTitle());
}
public function testFindByUrlHashMoreThanOneResult()
{
$this->expectException('OCP\AppFramework\Db\MultipleObjectsReturnedException');
$feed1 = $this->feedMapper->insert(
new FeedFixture(
[
'urlHash' => 'someTestHash'
]
)
);
$feed2 = $this->feedMapper->insert(
new FeedFixture(
[
'urlHash' => 'someTestHash'
]
)
);
$this->feedMapper->findByUrlHash($feed1->getUrlHash(), $this->user);
}
public function testFindByUrlHashNotExisting()
{
$this->expectException('OCP\AppFramework\Db\DoesNotExistException');
$this->feedMapper->findByUrlHash('some random hash', $this->user);
}
public function testDelete()
{
$this->loadFixtures('default');
$feeds = $this->feedMapper->findAllFromUser($this->user);
$this->assertCount(4, $feeds);
$feed = reset($feeds);
$items = $this->itemMapper->findAllFeed(
$feed->getId(), 100, 0, true, false, $this->user
);
$this->assertCount(7, $items);
$this->feedMapper->delete($feed);
$this->assertCount(3, $this->feedMapper->findAllFromUser($this->user));
$items = $this->itemMapper->findAllFeed(
$feed->getId(), 100, 0, true, false, $this->user
);
$this->assertCount(0, $items);
}
public function testGetToDelete()
{
$this->loadFeedFixtures(
[
['deletedAt' => 1],
['deletedAt' => 0],
['deletedAt' => 1, 'userId' => 'john'],
['deletedAt' => 1000]
]
);
$fetched = $this->feedMapper->getToDelete();
$this->assertIsArray($fetched);
$this->assertCount(3, $fetched);
$this->assertContainsOnlyInstancesOf(Feed::class, $fetched);
$this->tearDownUser('john');
}
public function testGetToDeleteOlderThan()
{
$this->loadFeedFixtures(
[
['deletedAt' => 1],
['deletedAt' => 0],
['deletedAt' => 1, 'userId' => 'john'],
['deletedAt' => 1000]
]
);
$fetched = $this->feedMapper->getToDelete(1000);
$this->assertIsArray($fetched);
$this->assertCount(2, $fetched);
$this->assertContainsOnlyInstancesOf(Feed::class, $fetched);
$this->tearDownUser('john');
}
public function testGetToDeleteUser()
{
$this->loadFeedFixtures(
[
['deletedAt' => 1],
['deletedAt' => 0],
['deletedAt' => 1, 'userId' => 'john'],
['deletedAt' => 1000]
]
);
$fetched = $this->feedMapper->getToDelete(2000, $this->user);
$this->assertIsArray($fetched);
$this->assertCount(2, $fetched);
$this->assertContainsOnlyInstancesOf(Feed::class, $fetched);
$this->tearDownUser('john');
}
public function testGetToDeleteEmpty()
{
$fetched = $this->feedMapper->getToDelete();
$this->assertIsArray($fetched);
$this->assertCount(0, $fetched);
}
public function testDeleteUser()
{
$this->loadFixtures('default');
$this->assertCount(4, $this->feedMapper->findAllFromUser($this->user));
$items = $this->itemMapper->findAllItems(100, 0, 0, true, false, $this->user);
$this->assertCount(9, $items);
$this->feedMapper->deleteUser($this->user);
$this->assertCount(0, $this->feedMapper->findAllFromUser($this->user));
$items = $this->itemMapper->findAllItems(100, 0, 0, true, false, $this->user);
$this->assertCount(0, $items);
}
}

View File

@ -1,285 +0,0 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2015
*/
namespace OCA\News\Tests\Integration\Db;
use OCA\News\Tests\Integration\IntegrationTest;
use OCA\News\Tests\Integration\Fixtures\FeedFixture;
use OCA\News\Tests\Integration\Fixtures\ItemFixture;
class ItemMapperTest extends IntegrationTest
{
public function testFind()
{
$feed = new FeedFixture();
$feed = $this->feedMapper->insert($feed);
$item = new ItemFixture(['feedId' => $feed->getId()]);
$item = $this->itemMapper->insert($item);
$fetched = $this->itemMapper->find($this->user, $item->getId());
$this->assertEquals($item->getTitle(), $fetched->getTitle());
}
/**
* Same as whereId with easier title search
*
* @param $title
* @return mixed
*/
private function whereTitleId($title)
{
return $this->findItemByTitle($title)->getId();
}
/**
* @expectedException \OCP\AppFramework\Db\DoesNotExistException
*/
public function testFindNotFoundWhenDeletedFeed()
{
$this->expectException('OCP\AppFramework\Db\DoesNotExistException');
$this->loadFixtures('default');
$id = $this->whereTitleId('not found feed');
$this->itemMapper->find($this->user, $id);
}
/**
* @expectedException \OCP\AppFramework\Db\DoesNotExistException
*/
public function testFindNotFoundWhenDeletedFolder()
{
$this->expectException('OCP\AppFramework\Db\DoesNotExistException');
$this->loadFixtures('default');
$id = $this->whereTitleId('not found folder');
$this->itemMapper->find($this->user, $id);
}
private function deleteReadOlderThanThreshold()
{
$this->loadFixtures('default');
$this->itemMapper->deleteReadOlderThanThreshold(1);
$this->itemMapper->find($this->user, $this->whereTitleId('a title1'));
$this->itemMapper->find($this->user, $this->whereTitleId('a title2'));
$this->itemMapper->find($this->user, $this->whereTitleId('a title3'));
$this->itemMapper->find($this->user, $this->whereTitleId('del3'));
$this->itemMapper->find($this->user, $this->whereTitleId('del4'));
}
/**
* @expectedException \OCP\AppFramework\Db\DoesNotExistException
*/
public function testDeleteOlderThanThresholdOne()
{
$this->expectException('OCP\AppFramework\Db\DoesNotExistException');
$this->loadFixtures('default');
$id = $this->whereTitleId('del1');
$this->deleteReadOlderThanThreshold();
$this->itemMapper->find($this->user, $id);
}
/**
* @expectedException \OCP\AppFramework\Db\DoesNotExistException
*/
public function testDeleteOlderThanThresholdTwo()
{
$this->expectException('OCP\AppFramework\Db\DoesNotExistException');
$this->loadFixtures('default');
$id = $this->whereTitleId('del2');
$this->deleteReadOlderThanThreshold();
$this->itemMapper->find($this->user, $id);
}
public function testStarredCount()
{
$this->loadFixtures('default');
$count = $this->itemMapper->starredCount($this->user);
$this->assertEquals(2, $count);
}
public function testReadAll()
{
$this->loadFixtures('default');
$this->itemMapper->readAll(PHP_INT_MAX, 10, $this->user);
$items = $this->itemMapper->findAllItems(
30, 0, 0, false, false, $this->user
);
$this->assertEquals(0, count($items));
$itemId = $this->whereTitleId('a title1');
$item = $this->itemMapper->find($this->user, $itemId);
$this->assertEquals(10, $item->getLastModified());
$itemId = $this->whereTitleId('a title3');
$item = $this->itemMapper->find($this->user, $itemId);
$this->assertEquals(10, $item->getLastModified());
$itemId = $this->whereTitleId('a title9');
$item = $this->itemMapper->find($this->user, $itemId);
$this->assertEquals(10, $item->getLastModified());
}
public function testReadFeed()
{
$this->loadFixtures('default');
$feedId = $this->findFeedByTitle('third feed')->getId();
$this->itemMapper->readFeed(
$feedId, PHP_INT_MAX, 10, $this->user
);
$items = $this->itemMapper->findAllItems(
30, 0, 0, false, false, $this->user
);
$this->assertEquals(2, count($items));
$item = $this->findItemByTitle('a title9');
$item = $this->itemMapper->find($this->user, $item->getId());
$this->assertEquals(10, $item->getLastModified());
$item = $this->findItemByTitle('a title3');
$item = $this->itemMapper->find($this->user, $item->getId());
$this->assertTrue($item->isUnread());
$item = $this->findItemByTitle('a title1');
$item = $this->itemMapper->find($this->user, $item->getId());
$this->assertTrue($item->isUnread());
}
public function testDeleteUser()
{
$this->loadFixtures('default');
$this->itemMapper->deleteUser($this->user);
$id = $this->itemMapper->getNewestItemId($this->user);
$this->assertEquals(0, $id);
}
public function testGetNewestItemId()
{
$this->loadFixtures('default');
$id = $this->itemMapper->getNewestItemId($this->user);
$itemId = $this->whereTitleId('no folder');
$this->assertEquals($itemId, $id);
}
public function testFindAllUnreadOrStarred()
{
$this->loadFixtures('default');
$items = $this->itemMapper->findAllUnreadOrStarred($this->user);
$this->assertEquals(4, count($items));
}
public function testReadItem()
{
$this->loadFixtures('readitem');
// assert that all items are unread
$feed = $this->feedMapper->where(['userId' => 'john'])[0];
$items = $this->itemMapper->where(['feedId' => $feed->getId()]);
foreach ($items as $item) {
$this->assertTrue($item->isUnread());
}
$feed = $this->feedMapper->where(['userId' => 'test'])[0];
$items = $this->itemMapper->where(['feedId' => $feed->getId()]);
foreach ($items as $item) {
$this->assertTrue($item->isUnread());
}
// read an item
$duplicateItem = $this->itemMapper->where(['feedId' => $feed->getId()])[0];
$this->itemMapper->readItem($duplicateItem->getId(), true, 1000, $this->user);
// assert that all test user's same items are read
$items = $this->itemMapper->where(['feedId' => $feed->getId(), 'title' => 'blubb']);
foreach ($items as $item) {
$this->assertFalse($item->isUnread());
}
// assert that a different item is not read
$items = $this->itemMapper->where(['feedId' => $feed->getId(), 'title' => 'blubbs']);
foreach ($items as $item) {
$this->assertTrue($item->isUnread());
}
// assert that other user's same items stayed the same
$johnsFeed = $this->feedMapper->where(['userId' => 'john'])[0];
$items = $this->itemMapper->where(['feedId' => $johnsFeed->getId()]);
foreach ($items as $item) {
$this->assertTrue($item->isUnread());
}
}
public function testUnreadItem()
{
$this->loadFixtures('readitem');
// unread an item
$feed = $this->feedMapper->where(['userId' => 'test'])[0];
$duplicateItem = $this->itemMapper->where(['feedId' => $feed->getId()])[0];
$this->itemMapper->readItem($duplicateItem->getId(), true, 1000, $this->user);
$this->itemMapper->readItem($duplicateItem->getId(), false, 1000, $this->user);
// assert that only one item is now unread
$items = $this->itemMapper->where(['feedId' => $feed->getId(), 'title' => 'blubb']);
foreach ($items as $item) {
if ($item->getId() === $duplicateItem->getId()) {
$this->assertTrue($item->isUnread());
} else {
$this->assertFalse($item->isUnread());
}
}
// assert that other user's same items stayed the same
$johnsFeed = $this->feedMapper->where(['userId' => 'john'])[0];
$items = $this->itemMapper->where(['feedId' => $johnsFeed->getId()]);
foreach ($items as $item) {
$this->assertTrue($item->isUnread());
}
}
protected function tearDown(): void
{
parent::tearDown();
$this->clearUserNewsDatabase('john');
}
}

View File

@ -1,54 +0,0 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2015
*/
namespace OCA\News\Tests\Integration\Fixtures;
use OCA\News\Db\Feed;
class FeedFixture extends Feed
{
use Fixture;
public function __construct(array $defaults = [])
{
parent::__construct();
$defaults = array_merge(
[
'userId' => 'test',
'urlHash' => 'urlHash',
'url' => 'http://the.url.com',
'title' => 'title',
'faviconLink' => 'http://feed.com/favicon.ico',
'added' => 3000,
'folderId' => null,
'link' => 'http://feed.com/rss',
'preventUpdate' => false,
'deletedAt' => 0,
'articlesPerUpdate' => 40,
'httpLastModified' => 10,
'httpEtag' => '',
'location' => 'http://feed.com/rss',
'ordering' => 0,
'fullTextEnabled' => false,
'pinned' => false,
'updateMode' => 0,
'updateErrorCount' => 0,
'lastUpdateError' => '',
],
$defaults
);
unset($defaults['items']);
$this->fillDefaults($defaults);
}
}

View File

@ -1,26 +0,0 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2015
*/
namespace OCA\News\Tests\Integration\Fixtures;
trait Fixture
{
protected function fillDefaults(array $defaults = [])
{
foreach ($defaults as $key => $value) {
$method = 'set' . ucfirst($key);
$this->$method($value);
}
}
}

View File

@ -1,40 +0,0 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2015
*/
namespace OCA\News\Tests\Integration\Fixtures;
use OCA\News\Db\Folder;
class FolderFixture extends Folder
{
use Fixture;
public function __construct(array $defaults = [])
{
parent::__construct();
$defaults = array_merge(
[
'parentId' => null,
'name' => 'folder',
'userId' => 'test',
'opened' => true,
'deletedAt' => 0,
'lastModified' => 9
],
$defaults
);
unset($defaults['feeds']);
$this->fillDefaults($defaults);
}
}

View File

@ -1,56 +0,0 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2015
*/
namespace OCA\News\Tests\Integration\Fixtures;
use OCA\News\Db\Item;
class ItemFixture extends Item
{
use Fixture;
public function __construct(array $defaults = [])
{
parent::__construct();
$defaults = array_merge(
[
'url' => 'http://google.de',
'title' => 'title',
'author' => 'my author',
'pubDate' => 2323,
'body' => 'this is a body',
'enclosureMime' => 'video/mpeg',
'enclosureLink' => 'http://google.de/web.webm',
'mediaThumbnail' => 'https://i3.ytimg.com/vi/Zgge1O9wdPY/hqdefault.jpg',
'mediaDescription' => 'The best video ever',
'feedId' => 0,
'unread' => true,
'starred' => false,
'lastModified' => 113,
'rtl' => false,
],
$defaults
);
if (!array_key_exists('guid', $defaults)) {
$defaults['guid'] = $defaults['title'];
}
if (!array_key_exists('guidHash', $defaults)) {
$defaults['guidHash'] = $defaults['guid'];
}
$this->fillDefaults($defaults);
$this->generateSearchIndex();
}
}

View File

@ -1,76 +0,0 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2015
*/
return [
'folders' => [
[
'name' => 'first folder',
'feeds' => [
[
'title' => 'first feed',
'url' => 'http://google.de',
'articlesPerUpdate' => 1,
'items' => [
['title' => 'a title1', 'guid' => 'abc'],
['title' => 'a title2', 'unread' => false, 'starred' => true, 'guid' => 'def'],
['title' => 'a title3', 'unread' => true, 'starred' => true, 'guid' => 'gih'],
['title' => 'del1', 'unread' => false, 'starred' => false],
['title' => 'del2', 'unread' => false, 'starred' => false],
['title' => 'del3', 'unread' => false, 'starred' => false],
['title' => 'del4', 'unread' => false, 'starred' => false]
]
],
[
'title' => 'second feed',
'url' => 'http://golem.de',
'items' => []
],
],
],
[
'name' => 'second folder',
'opened' => false,
'feeds' => [
[
'title' => 'third feed',
'url' => 'http://heise.de',
'items' => [['title' => 'a title9']]
],
[
'title' => 'sixth feed',
'url' => 'http://gremlins.de',
'deletedAt' => 999999999,
'items' => [['title' => 'not found feed', 'guid' => 'not found']]
]
],
],
[
'name' => 'third folder',
'deletedAt' => 9999999999,
'feeds' => [
[
'title' => 'fifth feed',
'url' => 'http://prolinux.de',
'items' => [['title' => 'not found folder', 'guid' => 'not found']]
]
],
]
],
'feeds' => [
[
'title' => 'fourth feed',
'url' => 'http://blog.fefe.de',
'items' => [
['title' => 'no folder', 'unread' => false, 'starred' => false]
]
]
]
];

View File

@ -1,33 +0,0 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2015
*/
return [
'feeds' => [
[
'title' => 'john feed',
'userId' => 'john',
'items' => [
['title' => 'blubb', 'unread' => true, 'starred' => false],
['title' => 'blubb', 'unread' => true, 'starred' => false]
]
],
[
'title' => 'test feed',
'userId' => 'test',
'items' => [
['title' => 'blubb', 'unread' => true, 'starred' => false],
['title' => 'blubbs', 'unread' => true, 'starred' => false],
['title' => 'blubb', 'unread' => true, 'starred' => false],
['title' => 'blubb', 'unread' => true, 'starred' => false]
]
]
]
];

View File

@ -1,225 +0,0 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Bernhard Posselt 2015
*/
namespace OCA\News\Tests\Integration;
use OCA\News\Db\FolderMapperV2;
use OCA\News\Db\Item;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\IAppContainer;
use OCP\IDBConnection;
use OCP\IUserManager;
use OCA\News\AppInfo\Application;
use OCA\News\Tests\Integration\Fixtures\ItemFixture;
use OCA\News\Tests\Integration\Fixtures\FeedFixture;
use OCA\News\Tests\Integration\Fixtures\FolderFixture;
use OCA\News\Db\FeedMapper;
use OCA\News\Db\ItemMapper;
abstract class IntegrationTest extends \Test\TestCase
{
protected $user = 'test';
protected $userPassword = 'test';
/**
* @var ItemMapper
*/
protected $itemMapper;
/**
* @var FeedMapper
*/
protected $feedMapper;
/**
* @var FolderMapperV2
*/
protected $folderMapper;
/**
* @var IAppContainer
*/
protected $container;
protected function setUp(): void
{
parent::setUp();
$app = new Application();
$this->container = $app->getContainer();
$this->tearDownUser($this->user);
$this->setupUser($this->user, $this->userPassword);
// set up database layers
$this->itemMapper = $this->container->get(ItemMapper::class);
$this->feedMapper = $this->container->get(FeedMapper::class);
$this->folderMapper = $this->container->get(FolderMapperV2::class);
}
protected function findItemByTitle($title)
{
// db logic in app code, negligible since its a test
$items = $this->itemMapper->where(['title' => $title]);
$feeds = $this->feedMapper->where(['userId' => $this->user]);
$feedIds = [];
foreach ($feeds as $feed) {
$feedIds[$feed->getId()] = true;
}
$result = array_filter(
$items,
function (Item $item) use ($feedIds) {
return array_key_exists($item->getFeedId(), $feedIds);
}
);
// ok so this is funny: array_filter preserves indices, meaning that
// you can't use 0 as key for the first element return from it :D
$result = array_values($result)[0];
return $result;
}
protected function findFeedByTitle($title)
{
return $this->feedMapper->where(
[
'userId' => $this->user,
'title' => $title
]
)[0];
}
/**
* @param string $name loads fixtures from a given file
*/
protected function loadFixtures(string $name)
{
$fixtures = include __DIR__ . '/Fixtures/data/' . $name . '.php';
if (array_key_exists('folders', $fixtures)) {
$this->loadFolderFixtures($fixtures['folders']);
}
if (array_key_exists('feeds', $fixtures)) {
$this->loadFeedFixtures($fixtures['feeds']);
}
}
protected function loadFolderFixtures(array $folderFixtures = [])
{
foreach ($folderFixtures as $folderFixture) {
$folder = new FolderFixture($folderFixture);
$folderId = $this->loadFixture($folder);
$this->loadFeedFixtures($folderFixture['feeds'], $folderId);
}
}
protected function loadFeedFixtures(array $feedFixtures = [], $folderId = null)
{
foreach ($feedFixtures as $feedFixture) {
$feed = new FeedFixture($feedFixture);
$feed->setFolderId($folderId);
$feedId = $this->loadFixture($feed);
if (!empty($feedFixture['items'])) {
$this->loadItemFixtures($feedFixture['items'], $feedId);
}
}
}
protected function loadItemFixtures(array $itemFixtures, $feedId)
{
foreach ($itemFixtures as $itemFixture) {
$item = new ItemFixture($itemFixture);
$item->setFeedId($feedId);
$this->loadFixture($item);
}
}
/**
* Saves a fixture in a database and returns the saved result
*
* @param Entity $fixture
* @return int the id
*/
protected function loadFixture(Entity $fixture)
{
if ($fixture instanceof FeedFixture) {
return $this->feedMapper->insert($fixture)->getId();
} elseif ($fixture instanceof ItemFixture) {
return $this->itemMapper->insert($fixture)->getId();
} elseif ($fixture instanceof FolderFixture) {
return $this->folderMapper->insert($fixture)->getId();
}
throw new \InvalidArgumentException('Invalid fixture class given');
}
/**
* Creates and logs in a new ownCloud user
*
* @param $user
* @param $password
*/
protected function setupUser($user, $password)
{
$userManager = $this->container->get(IUserManager::class);
$userManager->createUser($user, $password);
$this->loginAsUser($user);
}
/**
* Removes a user and his News app database entries from the database
*
* @param $user
*/
protected function tearDownUser($user)
{
$userManager = $this->container->get(IUserManager::class);
if ($userManager->userExists($user)) {
$userManager->get($user)->delete();
}
$this->clearUserNewsDatabase($user);
}
/**
* Deletes all news entries of a given user
*
* @param string $user
*/
protected function clearUserNewsDatabase(string $user)
{
$sql = [
'DELETE FROM `*PREFIX*news_items` WHERE `feed_id` IN
(SELECT `id` FROM `*PREFIX*news_feeds` WHERE `user_id` = ?)',
'DELETE FROM `*PREFIX*news_feeds` WHERE `user_id` = ?',
'DELETE FROM `*PREFIX*news_folders` WHERE `user_id` = ?'
];
$db = $this->container->get(IDBConnection::class);
foreach ($sql as $query) {
$db->prepare($query)->execute([$user]);
}
}
protected function tearDown(): void
{
parent::tearDown();
$this->tearDownUser($this->user);
}
}