From 3bdae6aed6288a7ed43325d255154ccdded03846 Mon Sep 17 00:00:00 2001 From: Ian Morland Date: Tue, 3 Oct 2023 18:33:39 +0100 Subject: [PATCH 1/8] chore: create tests for expected forum attributes --- .github/workflows/backend.yml | 11 + .github/workflows/{build.yml => frontend.yml} | 5 +- composer.json | 41 ++- extend.php | 11 + src/PermissionBasedForumSettings.php | 8 +- tests/.phpunit.result.cache | 1 + tests/fixtures/.gitkeep | 0 tests/integration/api/ForumAttributeTest.php | 338 ++++++++++++++++++ tests/integration/setup.php | 16 + tests/phpunit.integration.xml | 25 ++ tests/phpunit.unit.xml | 27 ++ tests/unit/.gitkeep | 0 12 files changed, 468 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/backend.yml rename .github/workflows/{build.yml => frontend.yml} (87%) create mode 100644 tests/.phpunit.result.cache create mode 100644 tests/fixtures/.gitkeep create mode 100644 tests/integration/api/ForumAttributeTest.php create mode 100644 tests/integration/setup.php create mode 100644 tests/phpunit.integration.xml create mode 100644 tests/phpunit.unit.xml create mode 100644 tests/unit/.gitkeep diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml new file mode 100644 index 0000000..b317004 --- /dev/null +++ b/.github/workflows/backend.yml @@ -0,0 +1,11 @@ +name: FoF User Directory PHP + +on: [workflow_dispatch, push, pull_request] + +jobs: + run: + uses: flarum/framework/.github/workflows/REUSABLE_backend.yml@main + with: + enable_backend_testing: false + + backend_directory: . diff --git a/.github/workflows/build.yml b/.github/workflows/frontend.yml similarity index 87% rename from .github/workflows/build.yml rename to .github/workflows/frontend.yml index ca3526b..5b7e163 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/frontend.yml @@ -1,4 +1,4 @@ -name: Javascript +name: FoF User Directory JS on: [workflow_dispatch, push, pull_request] @@ -8,11 +8,12 @@ jobs: with: enable_bundlewatch: false enable_prettier: true - enable_typescript: false + enable_typescript: true frontend_directory: ./js backend_directory: . js_package_manager: npm main_git_branch: master + secrets: bundlewatch_github_token: ${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }} diff --git a/composer.json b/composer.json index d56ccfc..fdcbbe0 100644 --- a/composer.json +++ b/composer.json @@ -14,14 +14,14 @@ "issues": "https://github.com/FriendsOfFlarum/user-directory/issues", "source": "https://github.com/FriendsOfFlarum/user-directory", "forum": "https://discuss.flarum.org/d/5682" - }, - "homepage": "https://friendsofflarum.org", - "funding": [ + }, + "homepage": "https://friendsofflarum.org", + "funding": [ { - "type": "website", - "url": "https://opencollective.com/fof/donate" + "type": "website", + "url": "https://opencollective.com/fof/donate" } - ], + ], "authors": [ { "name": "Daniƫl Klabbers", @@ -56,11 +56,40 @@ }, "flagrow": { "discuss": "https://discuss.flarum.org/d/5682" + }, + "flarum-cli": { + "modules": { + "githubActions": true, + "backendTesting": true + } } }, "autoload": { "psr-4": { "FoF\\UserDirectory\\": "src/" } + }, + "autoload-dev": { + "psr-4": { + "FoF\\UserDirectory\\Tests\\": "tests/" + } + }, + "scripts": { + "test": [ + "@test:unit", + "@test:integration" + ], + "test:unit": "phpunit -c tests/phpunit.unit.xml", + "test:integration": "phpunit -c tests/phpunit.integration.xml", + "test:setup": "@php tests/integration/setup.php" + }, + "scripts-descriptions": { + "test": "Runs all tests.", + "test:unit": "Runs all unit tests.", + "test:integration": "Runs all integration tests.", + "test:setup": "Sets up a database for use with integration tests. Execute this only once." + }, + "require-dev": { + "flarum/testing": "^1.0.0" } } diff --git a/extend.php b/extend.php index a77f300..12eb1b1 100644 --- a/extend.php +++ b/extend.php @@ -33,4 +33,15 @@ (new Extend\View()) ->namespace('fof.user-directory', __DIR__.'/resources/views'), + + (new Extend\Settings()) + ->default('fof-user-directory.admin.settings.link', false) + ->default('fof-user-directory.use-small-cards', false) + ->default('fof-user-directory.disable-global-search-source', false) + ->default('fof-user-directory.default-sort', 'default') + ->default('fof-user-directory.link-group-mentions', true) + ->serializeToForum('userDirectorySmallCards', 'fof-user-directory.use-small-cards') + ->serializeToForum('userDirectoryDisableGlobalSearchSource', 'fof-user-directory.disable-global-search-source') + ->serializeToForum('userDirectoryDefaultSort', 'fof-user-directory.default-sort') + ->serializeToForum('userDirectoryLinkGroupMentions', 'fof-user-directory.link-group-mentions'), ]; diff --git a/src/PermissionBasedForumSettings.php b/src/PermissionBasedForumSettings.php index 1932f80..4607f91 100644 --- a/src/PermissionBasedForumSettings.php +++ b/src/PermissionBasedForumSettings.php @@ -26,16 +26,10 @@ public function __construct(SettingsRepositoryInterface $settings) $this->settings = $settings; } - public function __invoke(ForumSerializer $serializer): array + public function __invoke(ForumSerializer $serializer, $model, array $attributes): array { - $attributes = []; - // The link is visible if the user can access the user directory AND the link was enabled in extension settings $attributes['canSeeUserDirectoryLink'] = $serializer->getActor()->can('seeUserList'); - $attributes['userDirectorySmallCards'] = (bool) $this->settings->get('fof-user-directory.use-small-cards'); - $attributes['userDirectoryDisableGlobalSearchSource'] = (bool) $this->settings->get('fof-user-directory.disable-global-search-source'); - $attributes['userDirectoryDefaultSort'] = $this->settings->get('fof-user-directory.default-sort') ?: 'default'; - $attributes['userDirectoryLinkGroupMentions'] = (bool) $this->settings->get('fof-user-directory.link-group-mentions'); // Only serialize if the actor has permission if ($permission = $serializer->getActor()->hasPermission('user.suspend')) { diff --git a/tests/.phpunit.result.cache b/tests/.phpunit.result.cache new file mode 100644 index 0000000..f563385 --- /dev/null +++ b/tests/.phpunit.result.cache @@ -0,0 +1 @@ +{"version":1,"defects":{"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_have_user_directory_link_when_setting_on":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_has_user_directory_link":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_does_not_have_user_directory_link_when_setting_disabled":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_has_user_directory_link_when_setting_enabled":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_have_user_directory_link_when_setting_on_and_permission_granted":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_have_user_directory_link_when_setting_on_and_permission_granted":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::use_small_cards_is_serialized_to_forum":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::required_attributes_are_serialized_to_forum_with_correct_defaults":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_setting_off_but_permission_granted":3},"times":{"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_has_user_directory_link":0.112,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_by_default":0.106,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_setting_off":0.105,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_have_user_directory_link_when_setting_on":0.118,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting":0.106,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_does_not_have_user_directory_link_when_setting_disabled":0.109,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_has_user_directory_link_when_setting_enabled":0.108,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_have_user_directory_link_when_setting_on_and_permission_granted":0.113,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_setting_off_and_no_permission":0.112,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_setting_off_but_permission_granted":0.109,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_not_have_user_directory_link_by_default":0.084,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting":0.085,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_not_have_user_directory_link_when_setting_off_and_no_permission":0.083,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_not_have_user_directory_link_when_setting_off_but_permission_granted":0.087,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_have_user_directory_link_when_setting_on_and_permission_granted":0.089,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::use_small_cards_is_serialized_to_forum":0.078,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::use_small_cards_is_serialized_to_forum_disabled_by_default":0.08,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::use_small_cards_is_serialized_to_forum_and_disabled_by_default":0.08,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::disable_global_search_source_setting_is_serialized_and_disabled_by_default":0.08,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::default_sort_setting_is_serialized_and_defaulted_to_default":0.079,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::link_group_mentions_setting_is_serialized_and_defaulted_to_true":0.077,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::required_attributes_are_serialized_to_forum_with_correct_defaults":0.084}} \ No newline at end of file diff --git a/tests/fixtures/.gitkeep b/tests/fixtures/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/api/ForumAttributeTest.php b/tests/integration/api/ForumAttributeTest.php new file mode 100644 index 0000000..244de4d --- /dev/null +++ b/tests/integration/api/ForumAttributeTest.php @@ -0,0 +1,338 @@ +extension('fof-user-directory'); + + $this->prepareDatabase([ + 'users' => [ + $this->normalUser(), + ], + ]); + } + + protected function normalUserDirectoryPermission() + { + $this->prepareDatabase([ + 'group_permission' => [ + [ + 'permission' => 'fof.user-directory.view', + 'group_id' => 3, + ], + ], + ]); + } + + protected function guestUserDirectoryPermission() + { + $this->prepareDatabase([ + 'group_permission' => [ + [ + 'permission' => 'fof.user-directory.view', + 'group_id' => 2, + ], + ], + ]); + } + + /** + * @test + */ + public function admin_does_not_have_user_directory_link_when_setting_disabled() + { + $response = $this->send( + $this->request( + 'GET', + '/api', + [ + 'authenticatedAs' => 1, + ] + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function admin_has_user_directory_link_when_setting_enabled() + { + $this->setting('fof-user-directory.admin.settings.link', true); + + $response = $this->send( + $this->request( + 'GET', + '/api', + [ + 'authenticatedAs' => 1, + ] + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertTrue($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + + + /** + * @test + */ + public function normal_user_does_not_have_user_directory_link_by_default() + { + $response = $this->send( + $this->request( + 'GET', + '/api', + [ + 'authenticatedAs' => 2, + ] + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function normal_user_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting() + { + $this->normalUserDirectoryPermission(); + + $response = $this->send( + $this->request( + 'GET', + '/api', + [ + 'authenticatedAs' => 2, + ] + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function normal_user_does_not_have_user_directory_link_when_setting_off_and_no_permission() + { + $this->setting('fof-user-directory-link', false); + + $response = $this->send( + $this->request( + 'GET', + '/api', + [ + 'authenticatedAs' => 2, + ] + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function normal_user_does_not_have_user_directory_link_when_setting_off_but_permission_granted() + { + $this->normalUserDirectoryPermission(); + $this->setting('fof-user-directory-link', false); + + $response = $this->send( + $this->request( + 'GET', + '/api', + [ + 'authenticatedAs' => 2, + ] + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function normal_user_does_have_user_directory_link_when_setting_on_and_permission_granted() + { + $this->normalUserDirectoryPermission(); + $this->setting('fof-user-directory-link', true); + + $response = $this->send( + $this->request( + 'GET', + '/api', + [ + 'authenticatedAs' => 2, + ] + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertTrue($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function guest_does_not_have_user_directory_link_by_default() + { + $response = $this->send( + $this->request( + 'GET', + '/api' + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function guest_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting() + { + $this->guestUserDirectoryPermission(); + + $response = $this->send( + $this->request( + 'GET', + '/api' + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function guest_does_not_have_user_directory_link_when_setting_off_and_no_permission() + { + $this->setting('fof-user-directory-link', false); + + $response = $this->send( + $this->request( + 'GET', + '/api' + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function guest_does_not_have_user_directory_link_when_setting_off_but_permission_granted() + { + $this->guestUserDirectoryPermission(); + $this->setting('fof-user-directory-link', false); + + $response = $this->send( + $this->request( + 'GET', + '/api' + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function guest_does_have_user_directory_link_when_setting_on_and_permission_granted() + { + $this->guestUserDirectoryPermission(); + $this->setting('fof-user-directory-link', true); + + $response = $this->send( + $this->request( + 'GET', + '/api' + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + + $this->assertArrayHasKey('canSeeUserDirectoryLink', $data['data']['attributes']); + $this->assertTrue($data['data']['attributes']['canSeeUserDirectoryLink']); + } + + /** + * @test + */ + public function required_attributes_are_serialized_to_forum_with_correct_defaults() + { + $response = $this->send( + $this->request( + 'GET', + '/api' + ) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $data = json_decode($response->getBody()->getContents(), true); + + $this->assertArrayHasKey('userDirectorySmallCards', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['userDirectorySmallCards'], 'Small cards'); + + $this->assertArrayHasKey('userDirectoryDisableGlobalSearchSource', $data['data']['attributes']); + $this->assertFalse($data['data']['attributes']['userDirectoryDisableGlobalSearchSource'], 'Disable global search source'); + + $this->assertArrayHasKey('userDirectoryDefaultSort', $data['data']['attributes']); + $this->assertEquals('default', $data['data']['attributes']['userDirectoryDefaultSort'], 'Default sort'); + + $this->assertArrayHasKey('userDirectoryLinkGroupMentions', $data['data']['attributes']); + $this->assertTrue($data['data']['attributes']['userDirectoryLinkGroupMentions'], 'Link group mentions'); + } +} diff --git a/tests/integration/setup.php b/tests/integration/setup.php new file mode 100644 index 0000000..67039c0 --- /dev/null +++ b/tests/integration/setup.php @@ -0,0 +1,16 @@ +run(); diff --git a/tests/phpunit.integration.xml b/tests/phpunit.integration.xml new file mode 100644 index 0000000..90fbbff --- /dev/null +++ b/tests/phpunit.integration.xml @@ -0,0 +1,25 @@ + + + + + ../src/ + + + + + ./integration + ./integration/tmp + + + diff --git a/tests/phpunit.unit.xml b/tests/phpunit.unit.xml new file mode 100644 index 0000000..d3a4a3e --- /dev/null +++ b/tests/phpunit.unit.xml @@ -0,0 +1,27 @@ + + + + + ../src/ + + + + + ./unit + + + + + + diff --git a/tests/unit/.gitkeep b/tests/unit/.gitkeep new file mode 100644 index 0000000..e69de29 From a674f0487ef143cb4c93865411e8da89bab1cd8c Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Tue, 3 Oct 2023 17:33:59 +0000 Subject: [PATCH 2/8] Apply fixes from StyleCI --- tests/integration/api/ForumAttributeTest.php | 23 +++++++++++++------- tests/integration/setup.php | 8 ++++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/tests/integration/api/ForumAttributeTest.php b/tests/integration/api/ForumAttributeTest.php index 244de4d..906a08e 100644 --- a/tests/integration/api/ForumAttributeTest.php +++ b/tests/integration/api/ForumAttributeTest.php @@ -1,5 +1,14 @@ [ [ 'permission' => 'fof.user-directory.view', - 'group_id' => 3, + 'group_id' => 3, ], ], ]); @@ -40,7 +49,7 @@ protected function guestUserDirectoryPermission() 'group_permission' => [ [ 'permission' => 'fof.user-directory.view', - 'group_id' => 2, + 'group_id' => 2, ], ], ]); @@ -73,7 +82,7 @@ public function admin_does_not_have_user_directory_link_when_setting_disabled() public function admin_has_user_directory_link_when_setting_enabled() { $this->setting('fof-user-directory.admin.settings.link', true); - + $response = $this->send( $this->request( 'GET', @@ -90,8 +99,6 @@ public function admin_has_user_directory_link_when_setting_enabled() $this->assertTrue($data['data']['attributes']['canSeeUserDirectoryLink']); } - - /** * @test */ @@ -119,7 +126,7 @@ public function normal_user_does_not_have_user_directory_link_by_default() public function normal_user_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting() { $this->normalUserDirectoryPermission(); - + $response = $this->send( $this->request( 'GET', @@ -231,7 +238,7 @@ public function guest_does_not_have_user_directory_link_by_default() public function guest_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting() { $this->guestUserDirectoryPermission(); - + $response = $this->send( $this->request( 'GET', diff --git a/tests/integration/setup.php b/tests/integration/setup.php index 67039c0..d7d5936 100644 --- a/tests/integration/setup.php +++ b/tests/integration/setup.php @@ -1,10 +1,12 @@ Date: Tue, 3 Oct 2023 18:36:52 +0100 Subject: [PATCH 3/8] chore: remove phpunit result cache --- tests/.phpunit.result.cache | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tests/.phpunit.result.cache diff --git a/tests/.phpunit.result.cache b/tests/.phpunit.result.cache deleted file mode 100644 index f563385..0000000 --- a/tests/.phpunit.result.cache +++ /dev/null @@ -1 +0,0 @@ -{"version":1,"defects":{"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_have_user_directory_link_when_setting_on":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_has_user_directory_link":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_does_not_have_user_directory_link_when_setting_disabled":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_has_user_directory_link_when_setting_enabled":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_have_user_directory_link_when_setting_on_and_permission_granted":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_have_user_directory_link_when_setting_on_and_permission_granted":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::use_small_cards_is_serialized_to_forum":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::required_attributes_are_serialized_to_forum_with_correct_defaults":3,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_setting_off_but_permission_granted":3},"times":{"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_has_user_directory_link":0.112,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_by_default":0.106,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_setting_off":0.105,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_have_user_directory_link_when_setting_on":0.118,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting":0.106,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_does_not_have_user_directory_link_when_setting_disabled":0.109,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::admin_has_user_directory_link_when_setting_enabled":0.108,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_have_user_directory_link_when_setting_on_and_permission_granted":0.113,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_setting_off_and_no_permission":0.112,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::normal_user_does_not_have_user_directory_link_when_setting_off_but_permission_granted":0.109,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_not_have_user_directory_link_by_default":0.084,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_not_have_user_directory_link_when_permission_is_granted_and_default_setting":0.085,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_not_have_user_directory_link_when_setting_off_and_no_permission":0.083,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_not_have_user_directory_link_when_setting_off_but_permission_granted":0.087,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::guest_does_have_user_directory_link_when_setting_on_and_permission_granted":0.089,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::use_small_cards_is_serialized_to_forum":0.078,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::use_small_cards_is_serialized_to_forum_disabled_by_default":0.08,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::use_small_cards_is_serialized_to_forum_and_disabled_by_default":0.08,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::disable_global_search_source_setting_is_serialized_and_disabled_by_default":0.08,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::default_sort_setting_is_serialized_and_defaulted_to_default":0.079,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::link_group_mentions_setting_is_serialized_and_defaulted_to_true":0.077,"FoF\\UserDirectory\\tests\\integration\\api\\ForumAttributeTest::required_attributes_are_serialized_to_forum_with_correct_defaults":0.084}} \ No newline at end of file From 7dbde31c53c6e6c2cd4ab30406a41588dbe2ff19 Mon Sep 17 00:00:00 2001 From: Ian Morland Date: Tue, 3 Oct 2023 18:37:23 +0100 Subject: [PATCH 4/8] chore: update .gitignore to include .phpunit.results.cache --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c27d506..241c841 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ js/node_modules/ vendor/ composer.lock js/dist +.phpunit.result.cache From 6df7d3dc321b4467a0340b4e622d413eb743cbb5 Mon Sep 17 00:00:00 2001 From: Ian Morland Date: Tue, 3 Oct 2023 18:39:41 +0100 Subject: [PATCH 5/8] chore: enable backend testing --- .github/workflows/backend.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index b317004..d094011 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -6,6 +6,6 @@ jobs: run: uses: flarum/framework/.github/workflows/REUSABLE_backend.yml@main with: - enable_backend_testing: false + enable_backend_testing: true backend_directory: . From b2b35a95a1a114f451c40a5a27ee8829b108f3bd Mon Sep 17 00:00:00 2001 From: Ian Morland Date: Tue, 3 Oct 2023 18:45:22 +0100 Subject: [PATCH 6/8] fix: showLink attr does not respect show link setting --- src/PermissionBasedForumSettings.php | 2 +- tests/integration/api/ForumAttributeTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PermissionBasedForumSettings.php b/src/PermissionBasedForumSettings.php index 4607f91..77691b6 100644 --- a/src/PermissionBasedForumSettings.php +++ b/src/PermissionBasedForumSettings.php @@ -29,7 +29,7 @@ public function __construct(SettingsRepositoryInterface $settings) public function __invoke(ForumSerializer $serializer, $model, array $attributes): array { // The link is visible if the user can access the user directory AND the link was enabled in extension settings - $attributes['canSeeUserDirectoryLink'] = $serializer->getActor()->can('seeUserList'); + $attributes['canSeeUserDirectoryLink'] = $serializer->getActor()->can('seeUserList') && $this->settings->get('fof-user-directory-link'); // Only serialize if the actor has permission if ($permission = $serializer->getActor()->hasPermission('user.suspend')) { diff --git a/tests/integration/api/ForumAttributeTest.php b/tests/integration/api/ForumAttributeTest.php index 906a08e..4772106 100644 --- a/tests/integration/api/ForumAttributeTest.php +++ b/tests/integration/api/ForumAttributeTest.php @@ -81,7 +81,7 @@ public function admin_does_not_have_user_directory_link_when_setting_disabled() */ public function admin_has_user_directory_link_when_setting_enabled() { - $this->setting('fof-user-directory.admin.settings.link', true); + $this->setting('fof-user-directory-link', true); $response = $this->send( $this->request( From e2f0e7b8fde2787c53ebe5303162cd4a6e1dcd0f Mon Sep 17 00:00:00 2001 From: Ian Morland Date: Tue, 3 Oct 2023 19:05:52 +0100 Subject: [PATCH 7/8] all tests good --- extend.php | 7 +++---- src/Content/UserDirectory.php | 12 +++++++++--- src/PermissionBasedForumSettings.php | 1 + tests/integration/api/ForumAttributeTest.php | 4 ++++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/extend.php b/extend.php index 12eb1b1..0be083b 100644 --- a/extend.php +++ b/extend.php @@ -40,8 +40,7 @@ ->default('fof-user-directory.disable-global-search-source', false) ->default('fof-user-directory.default-sort', 'default') ->default('fof-user-directory.link-group-mentions', true) - ->serializeToForum('userDirectorySmallCards', 'fof-user-directory.use-small-cards') - ->serializeToForum('userDirectoryDisableGlobalSearchSource', 'fof-user-directory.disable-global-search-source') - ->serializeToForum('userDirectoryDefaultSort', 'fof-user-directory.default-sort') - ->serializeToForum('userDirectoryLinkGroupMentions', 'fof-user-directory.link-group-mentions'), + ->serializeToForum('userDirectorySmallCards', 'fof-user-directory.use-small-cards', 'boolVal') + ->serializeToForum('userDirectoryDisableGlobalSearchSource', 'fof-user-directory.disable-global-search-source', 'boolVal') + ->serializeToForum('userDirectoryLinkGroupMentions', 'fof-user-directory.link-group-mentions', 'boolVal'), ]; diff --git a/src/Content/UserDirectory.php b/src/Content/UserDirectory.php index fa9367a..6db09fa 100644 --- a/src/Content/UserDirectory.php +++ b/src/Content/UserDirectory.php @@ -31,7 +31,12 @@ class UserDirectory /** * @var Factory */ - private $view; + protected $view; + + /** + * @var SettingsRepositoryInterface + */ + protected $settings; /** * A map of sort query param values to their API sort param. @@ -47,10 +52,11 @@ class UserDirectory 'least_discussions' => 'discussionCount', ]; - public function __construct(Client $api, Factory $view) + public function __construct(Client $api, Factory $view, SettingsRepositoryInterface $settings) { $this->api = $api; $this->view = $view; + $this->settings = $settings; } private function getDocument(User $actor, array $params, Request $request) @@ -68,7 +74,7 @@ public function __invoke(Document $document, Request $request): Document $queryParams = $request->getQueryParams(); $actor = RequestUtil::getActor($request); - $sort = Arr::pull($queryParams, 'sort') ?: resolve(SettingsRepositoryInterface::class)->get('fof-user-directory.default-sort'); + $sort = Arr::pull($queryParams, 'sort') ?: $this->settings->get('fof-user-directory.default-sort'); $q = Arr::pull($queryParams, 'q'); $page = Arr::pull($queryParams, 'page', 1); diff --git a/src/PermissionBasedForumSettings.php b/src/PermissionBasedForumSettings.php index 77691b6..6e85f67 100644 --- a/src/PermissionBasedForumSettings.php +++ b/src/PermissionBasedForumSettings.php @@ -30,6 +30,7 @@ public function __invoke(ForumSerializer $serializer, $model, array $attributes) { // The link is visible if the user can access the user directory AND the link was enabled in extension settings $attributes['canSeeUserDirectoryLink'] = $serializer->getActor()->can('seeUserList') && $this->settings->get('fof-user-directory-link'); + $attributes['userDirectoryDefaultSort'] = $this->settings->get('fof-user-directory.default-sort') ?: 'default'; // Only serialize if the actor has permission if ($permission = $serializer->getActor()->hasPermission('user.suspend')) { diff --git a/tests/integration/api/ForumAttributeTest.php b/tests/integration/api/ForumAttributeTest.php index 4772106..1a550dc 100644 --- a/tests/integration/api/ForumAttributeTest.php +++ b/tests/integration/api/ForumAttributeTest.php @@ -51,6 +51,10 @@ protected function guestUserDirectoryPermission() 'permission' => 'fof.user-directory.view', 'group_id' => 2, ], + [ + 'permission' => 'searchUsers', + 'group_id' => 2, + ] ], ]); } From b406094281cd09d5ddbb5e69bb73e4efcca256cb Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Tue, 3 Oct 2023 18:06:02 +0000 Subject: [PATCH 8/8] Apply fixes from StyleCI --- tests/integration/api/ForumAttributeTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/api/ForumAttributeTest.php b/tests/integration/api/ForumAttributeTest.php index 1a550dc..3f37415 100644 --- a/tests/integration/api/ForumAttributeTest.php +++ b/tests/integration/api/ForumAttributeTest.php @@ -54,7 +54,7 @@ protected function guestUserDirectoryPermission() [ 'permission' => 'searchUsers', 'group_id' => 2, - ] + ], ], ]); }