aboutsummaryrefslogtreecommitdiff
path: root/tests/jsonapi/BlubberMentionsRelationshipTest.php
blob: a2dfe447845e6debc2d2412ed23a2350623eb193 (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
<?php

use JsonApi\Routes\Blubber\Rel\Mentions;
use JsonApi\Schemas\User as UsersSchema;

require_once 'BlubberTestHelper.php';

class BlubberMentionsRelationshipTest extends \Codeception\Test\Unit
{
    use BlubberTestHelper;

    /**
     * @var \UnitTester
     */
    protected $tester;

    protected function _before()
    {
        \DBManager::getInstance()->setConnection('studip', $this->getModule('\\Helper\\StudipDb')->dbh);
    }

    protected function _after()
    {
    }

    // tests
    public function testFetchRelationship()
    {
        $credentials = $this->tester->getCredentialsForTestAutor();

        $thread = $this->createPrivateBlubberThreadForUser($credentials, [$credentials]);

        $app = $this->tester->createApp(
            $credentials,
            'get',
            '/blubber-threads/{id}/relationships/mentions',
            Mentions::class);

        $requestBuilder = $this->tester->createRequestBuilder($credentials);
        $requestBuilder->setUri('/blubber-threads/'.$thread->id.'/relationships/mentions')->fetch();

        $response = $this->tester->sendMockRequest($app, $requestBuilder->getRequest());
        $this->tester->assertTrue($response->isSuccessfulDocument([200]));

        $document = $response->document();
        $this->tester->assertTrue($document->isResourceCollectionDocument());

        $resources = $document->primaryResources();
        $this->tester->assertCount(count($thread->mentions), $resources);
    }

    public function testAddRelationship()
    {
        $credentials = $this->tester->getCredentialsForTestAutor();

        $thread = $this->createPrivateBlubberThreadForUser($credentials, [$credentials]);
        $this->tester->assertCount(1, $thread->mentions);

        $app = $this->tester->createApp(
            $credentials,
            'post',
            '/blubber-threads/{id}/relationships/mentions',
            Mentions::class);

        $requestBuilder = $this->tester->createRequestBuilder($credentials);
        $requestBuilder->setUri('/blubber-threads/'.$thread->id.'/relationships/mentions')
                       ->create()
                       ->setJsonApiBody($this->prepareValidBody([$this->tester->getCredentialsForTestDozent()]));

        $response = $this->tester->sendMockRequest($app, $requestBuilder->getRequest());

        $this->tester->assertSame(204, $response->getStatusCode());
        $this->tester->assertCount(2, \BlubberThread::find($thread->id)->mentions);
    }

    public function testRemoveRelationship()
    {
        $credentials1 = $this->tester->getCredentialsForTestAutor();
        $credentials2 = $this->tester->getCredentialsForTestDozent();
        $credentials3 = $this->tester->getCredentialsForTestAdmin();

        $thread = $this->createPrivateBlubberThreadForUser($credentials1, [$credentials1, $credentials2, $credentials3]);
        $this->tester->assertCount(3, $thread->mentions);

        $app = $this->tester->createApp(
            $credentials1,
            'delete',
            '/blubber-threads/{id}/relationships/mentions',
            Mentions::class);

        $requestBuilder = $this->tester->createRequestBuilder($credentials1);
        $requestBuilder->setUri('/blubber-threads/'.$thread->id.'/relationships/mentions')
                       ->delete()
                       ->setJsonApiBody($this->prepareValidBody([$credentials1]));

        $response = $this->tester->sendMockRequest($app, $requestBuilder->getRequest());

        $this->tester->assertSame(204, $response->getStatusCode());
        $this->tester->assertCount(2, \BlubberThread::find($thread->id)->mentions);
    }


    private function prepareValidBody(array $users)
    {
        return [
            'data' => array_map(
                function ($user) {
                    return [
                        'type' => UsersSchema::TYPE,
                        'id' => $user['id'],
                    ];
                },
                $users
            ),
        ];
    }
}