summaryrefslogtreecommitdiffstats
path: root/tests/integration/IntegrationTest.php
blob: 1baa3135997789d8aa3ef7f38570660617f54523 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
/**
 * ownCloud - 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 PHPUnit_Framework_TestCase;

use OCP\IDb;
use OCP\IUserSession;
use OCP\IUserManager;

use OCA\News\AppInfo\Application;
use OCA\News\Tests\Integration\Fixtures\Fixture;
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;
use OCA\News\Db\FolderMapper;


abstract class IntegrationTest extends PHPUnit_Framework_TestCase {

    protected $user = 'test';
    protected $userPassword = 'test';

    /** @var ItemMapper */
    protected $itemMapper;

    /** @var  FeedMapper */
    protected $feedMapper;

    /** @var FolderMapper */
    protected $folderMapper;

    protected function setUp() {
        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->query(ItemMapper::class);
        $this->feedMapper = $this->container->query(FeedMapper::class);
        $this->folderMapper = $this->container->query(FolderMapper::class);
    }

    /**
     * Saves a fixture in a database and returns the saved result
     * @param Fixture $fixture
     * @return \OCP\AppFramework\Db\Entity
     */
    protected function loadFixture(Fixture $fixture) {
        if ($fixture instanceof FeedFixture) {
            return $this->feedMapper->insert($fixture);
        } elseif ($fixture instanceof ItemFixture) {
            return $this->itemMapper->insert($fixture);
        } elseif ($fixture instanceof FolderFixture) {
            return $this->folderMapper->insert($fixture);
        }

        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->query(IUserManager::class);
        $userManager->createUser($user, $password);

        $session = $this->container->query(IUserSession::class);
        $session->login($user, $password);
    }

    /**
     * Removes a user and his News app database entries from the database
     * @param $user
     */
    protected function tearDownUser($user) {
        $userManager = $this->container->query(IUserManager::class);

        if ($userManager->userExists($user)) {
            $userManager->get($user)->delete();
        }

        $this->clearNewsDatabase($user);
    }

    /**
     * Deletes all news entries of a given user
     * @param string $user
     */
    protected function clearUserNewsDatabase($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->query(IDb::class);
        foreach ($sql as $query) {
            $db->prepareQuery($query)->execute([$user]);
        }
    }

    protected function tearDown() {
        parent::tearDown();
        $this->tearDownUser($this->user);
    }

}