Skip to content

Commit 11f9718

Browse files
[2.x] fix(tags): defer policy if min primary & secondary tags 0 (#4279)
* test(tags): implement forum attribute tests * fix(tags): defer policy if min primary & secondary tags 0 * style(tags): change formatting * Update extensions/tags/composer.json --------- Co-authored-by: IanM <[email protected]>
1 parent c0177c9 commit 11f9718

File tree

3 files changed

+103
-1
lines changed

3 files changed

+103
-1
lines changed

extensions/tags/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@
7979
},
8080
"require-dev": {
8181
"flarum/core": "*@dev",
82-
"flarum/testing": "^2.0"
82+
"flarum/testing": "^2.0",
83+
"flarum/suspend": "^2.0"
8384
},
8485
"repositories": [
8586
{

extensions/tags/src/Access/GlobalPolicy.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ public function can(User $actor, string $ability): ?string
3232
return $this->allow();
3333
}
3434

35+
if ($ability === 'startDiscussion') {
36+
$minPrimaryTags = (int) $this->settings->get('flarum-tags.min_primary_tags');
37+
$minSecondaryTags = (int) $this->settings->get('flarum-tags.min_secondary_tags');
38+
39+
if ($minPrimaryTags === 0 && $minSecondaryTags === 0) {
40+
return null;
41+
}
42+
}
43+
3544
if (in_array($ability, ['viewForum', 'startDiscussion'])) {
3645
if (! isset($enoughPrimary[$actor->id][$ability])) {
3746
$primaryTagsWhereNeedsPermission = $this->settings->get('flarum-tags.min_primary_tags');
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?php
2+
3+
/*
4+
* This file is part of Flarum.
5+
*
6+
* For detailed copyright and license information, please view the
7+
* LICENSE file that was distributed with this source code.
8+
*/
9+
10+
namespace Flarum\Tags\Tests\integration\api\forum;
11+
12+
use Flarum\Tags\Tag;
13+
use Flarum\Tags\Tests\integration\RetrievesRepresentativeTags;
14+
use Flarum\Testing\integration\RetrievesAuthorizedUsers;
15+
use Flarum\Testing\integration\TestCase;
16+
use Flarum\User\User;
17+
use Illuminate\Support\Arr;
18+
use PHPUnit\Framework\Attributes\DataProvider;
19+
use PHPUnit\Framework\Attributes\Test;
20+
21+
class ForumAttributeTest extends TestCase
22+
{
23+
use RetrievesAuthorizedUsers;
24+
use RetrievesRepresentativeTags;
25+
26+
/**
27+
* @inheritDoc
28+
*/
29+
protected function setUp(): void
30+
{
31+
parent::setUp();
32+
33+
$this->extension('flarum-tags');
34+
$this->extension('flarum-suspend');
35+
36+
$this->prepareDatabase([
37+
Tag::class => $this->tags(),
38+
User::class => [
39+
$this->normalUser(),
40+
['id' => 3, 'username' => 'suspended-user', 'email' => '[email protected]', 'suspended_until' => '2043-11-17 22:05:23', 'is_email_confirmed' => 1],
41+
]
42+
]);
43+
}
44+
45+
public static function canStartDiscussionProvider(): array
46+
{
47+
return [
48+
'admin user, min 0/0' => ['authenticatedAs' => 1, 'minPrimary' => 0, 'minSecondary' => 0, 'expected' => true],
49+
'normal user, min 0/0' => ['authenticatedAs' => 2, 'minPrimary' => 0, 'minSecondary' => 0, 'expected' => true],
50+
'suspended user, min 0/0' => ['authenticatedAs' => 3, 'minPrimary' => 0, 'minSecondary' => 0, 'expected' => false],
51+
'guest user, min 0/0' => ['authenticatedAs' => null, 'minPrimary' => 0, 'minSecondary' => 0, 'expected' => false],
52+
53+
'admin user, min 1/0' => ['authenticatedAs' => 1, 'minPrimary' => 1, 'minSecondary' => 0, 'expected' => true],
54+
'normal user, min 1/0' => ['authenticatedAs' => 2, 'minPrimary' => 1, 'minSecondary' => 0, 'expected' => true],
55+
'suspended user, min 1/0' => ['authenticatedAs' => 3, 'minPrimary' => 1, 'minSecondary' => 0, 'expected' => false],
56+
'guest user, min 1/0' => ['authenticatedAs' => null, 'minPrimary' => 1, 'minSecondary' => 0, 'expected' => false],
57+
58+
'admin user, min 0/1' => ['authenticatedAs' => 1, 'minPrimary' => 0, 'minSecondary' => 1, 'expected' => true],
59+
'normal user, min 0/1' => ['authenticatedAs' => 2, 'minPrimary' => 0, 'minSecondary' => 1, 'expected' => true],
60+
'suspended user, min 0/1' => ['authenticatedAs' => 3, 'minPrimary' => 0, 'minSecondary' => 1, 'expected' => false],
61+
'guest user, min 0/1' => ['authenticatedAs' => null, 'minPrimary' => 0, 'minSecondary' => 1, 'expected' => false],
62+
63+
'admin user, min 1/1' => ['authenticatedAs' => 1, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => true],
64+
'normal user, min 1/1' => ['authenticatedAs' => 2, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => true],
65+
'suspended user, min 1/1' => ['authenticatedAs' => 3, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => false],
66+
'guest user, min 1/1' => ['authenticatedAs' => null, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => false],
67+
];
68+
}
69+
70+
#[Test]
71+
#[DataProvider('canStartDiscussionProvider')]
72+
public function itReturnsTheExpectedCanStartDiscussionAttribute(
73+
?int $authenticatedAs,
74+
int $minPrimary,
75+
int $minSecondary,
76+
bool $expected
77+
) {
78+
$this->setting('flarum-tags.min_primary_tags', $minPrimary);
79+
$this->setting('flarum-tags.min_secondary_tags', $minSecondary);
80+
81+
$response = $this->send(
82+
$this->request('GET', '/api', [
83+
'authenticatedAs' => $authenticatedAs,
84+
])
85+
);
86+
87+
$this->assertEquals(200, $response->getStatusCode());
88+
89+
$json = json_decode($response->getBody()->getContents(), true);
90+
$this->assertEquals($expected, Arr::get($json, 'data.attributes.canStartDiscussion'));
91+
}
92+
}

0 commit comments

Comments
 (0)