From 5caae18f0823ebe0ca142a7ca7f2acf9b3ada5c4 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Wed, 13 May 2026 16:13:14 +0900 Subject: [PATCH] feat(site): add default post roles for new buckets --- app/Models/Common/Buckets.php | 130 ++++++++ app/Plugins/Manage/SiteManage/SiteManage.php | 14 + app/Plugins/User/Bbses/BbsesPlugin.php | 2 +- app/Plugins/User/Blogs/BlogsPlugin.php | 2 +- app/Plugins/User/Cabinets/CabinetsPlugin.php | 2 +- .../User/Calendars/CalendarsPlugin.php | 2 +- app/Plugins/User/Contents/ContentsPlugin.php | 2 +- .../User/Databases/DatabasesPlugin.php | 10 +- app/Plugins/User/Faqs/FaqsPlugin.php | 5 +- .../User/Photoalbums/PhotoalbumsPlugin.php | 2 +- .../User/Reservations/ReservationsPlugin.php | 4 +- .../User/Slideshows/SlideshowsPlugin.php | 10 +- app/Plugins/User/UserPluginBase.php | 12 +- .../plugins/common/frame_edit_roles.blade.php | 10 +- .../manage/site/pdf/base_main.blade.php | 8 + .../views/plugins/manage/site/site.blade.php | 28 ++ .../SiteManageNewBucketDefaultRolesTest.php | 199 ++++++++++++ .../BbsesDefaultBucketRolesFeatureTest.php | 85 ++++++ .../BlogsDefaultBucketRolesFeatureTest.php | 48 +++ .../CabinetsDefaultBucketRolesFeatureTest.php | 40 +++ ...CalendarsDefaultBucketRolesFeatureTest.php | 39 +++ .../ContentsDefaultBucketRolesFeatureTest.php | 84 ++++++ ...DatabasesDefaultBucketRolesFeatureTest.php | 56 ++++ .../DefaultBucketRolesFeatureTestTrait.php | 146 +++++++++ .../FaqsDefaultBucketRolesFeatureTest.php | 45 +++ ...otoalbumsDefaultBucketRolesFeatureTest.php | 42 +++ ...ervationsDefaultBucketRolesFeatureTest.php | 40 +++ ...lideshowsDefaultBucketRolesFeatureTest.php | 44 +++ .../Common/BucketsDefaultPostRolesTest.php | 283 ++++++++++++++++++ 29 files changed, 1369 insertions(+), 25 deletions(-) create mode 100644 tests/Feature/Plugins/Manage/SiteManage/SiteManageNewBucketDefaultRolesTest.php create mode 100644 tests/Feature/Plugins/User/Bbses/BbsesDefaultBucketRolesFeatureTest.php create mode 100644 tests/Feature/Plugins/User/Blogs/BlogsDefaultBucketRolesFeatureTest.php create mode 100644 tests/Feature/Plugins/User/Cabinets/CabinetsDefaultBucketRolesFeatureTest.php create mode 100644 tests/Feature/Plugins/User/Calendars/CalendarsDefaultBucketRolesFeatureTest.php create mode 100644 tests/Feature/Plugins/User/Contents/ContentsDefaultBucketRolesFeatureTest.php create mode 100644 tests/Feature/Plugins/User/Databases/DatabasesDefaultBucketRolesFeatureTest.php create mode 100644 tests/Feature/Plugins/User/DefaultBucketRolesFeatureTestTrait.php create mode 100644 tests/Feature/Plugins/User/Faqs/FaqsDefaultBucketRolesFeatureTest.php create mode 100644 tests/Feature/Plugins/User/Photoalbums/PhotoalbumsDefaultBucketRolesFeatureTest.php create mode 100644 tests/Feature/Plugins/User/Reservations/ReservationsDefaultBucketRolesFeatureTest.php create mode 100644 tests/Feature/Plugins/User/Slideshows/SlideshowsDefaultBucketRolesFeatureTest.php create mode 100644 tests/Unit/Models/Common/BucketsDefaultPostRolesTest.php diff --git a/app/Models/Common/Buckets.php b/app/Models/Common/Buckets.php index c17fa9044..f3350380e 100644 --- a/app/Models/Common/Buckets.php +++ b/app/Models/Common/Buckets.php @@ -3,6 +3,7 @@ namespace App\Models\Common; use App\Models\Common\BucketsRoles; +use App\Models\Core\Configs; use App\Traits\ConnectRoleTrait; use Database\Factories\Common\BucketsFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -14,6 +15,30 @@ class Buckets extends Model use ConnectRoleTrait; use HasFactory; + /** + * 新規バケツの投稿権限初期値に対応するConfig名 + */ + private const DEFAULT_NEW_BUCKET_POST_ROLE_CONFIGS = [ + 'role_article' => 'new_bucket_role_article_post_flag', + 'role_reporter' => 'new_bucket_role_reporter_post_flag', + ]; + + /** + * 新規バケツの投稿権限初期値を適用する対象プラグイン + */ + private const DEFAULT_POST_ROLE_TARGET_PLUGINS = [ + 'bbses', + 'blogs', + 'cabinets', + 'calendars', + 'contents', + 'databases', + 'faqs', + 'photoalbums', + 'reservations', + 'slideshows', + ]; + /** * create()やupdate()で入力を受け付ける ホワイトリスト */ @@ -27,6 +52,13 @@ class Buckets extends Model // Buckets のrole private $buckets_roles = null; + protected static function booted() + { + static::deleting(function ($bucket) { + BucketsRoles::where('buckets_id', $bucket->id)->delete(); + }); + } + /** * 投稿権限データをrole の配列で返却 */ @@ -221,6 +253,104 @@ public function needApprovalUser($user, $frame = null) return true; } + /** + * 新規バケツ作成時の投稿権限初期値を適用する。 + */ + public function initializeDefaultPostRoles(): void + { + $default_post_role_flags = self::getDefaultNewBucketPostRoleFlags(); + + foreach ($default_post_role_flags as $role => $post_flag) { + if ((int) $post_flag !== 1) { + continue; + } + + BucketsRoles::firstOrCreate( + [ + 'buckets_id' => $this->id, + 'role' => $role, + ], + [ + 'post_flag' => 1, + 'approval_flag' => 0, + ] + ); + } + } + + /** + * 投稿権限設定を持つプラグインの新規バケツなら、投稿権限初期値を適用する。 + */ + public function initializeDefaultPostRolesIfTargetPlugin(): void + { + if (!self::isDefaultPostRoleTargetPlugin($this->plugin_name)) { + return; + } + + $this->initializeDefaultPostRoles(); + } + + /** + * 新規バケツを作成し、対象プラグインだけ投稿権限初期値を適用する。 + */ + public static function createWithDefaultPostRoles(array $attributes): self + { + $bucket = self::create($attributes); + $bucket->initializeDefaultPostRolesIfTargetPlugin(); + + return $bucket; + } + + /** + * バケツを作成または更新し、新規作成時だけ投稿権限初期値を適用する。 + */ + public static function updateOrCreateWithDefaultPostRoles(array $attributes, array $values = []): self + { + $bucket = self::updateOrCreate($attributes, $values); + + if ($bucket->wasRecentlyCreated) { + $bucket->initializeDefaultPostRolesIfTargetPlugin(); + } + + return $bucket; + } + + /** + * 新規バケツの投稿権限初期値を適用する対象プラグインか判定する。 + */ + public static function isDefaultPostRoleTargetPlugin(?string $plugin_name): bool + { + return in_array($plugin_name, self::DEFAULT_POST_ROLE_TARGET_PLUGINS, true); + } + + /** + * 新規バケツ作成時の投稿権限初期値を取得する。 + */ + public static function getDefaultNewBucketPostRoleFlags(): array + { + $config_names = array_values(self::DEFAULT_NEW_BUCKET_POST_ROLE_CONFIGS); + $configs = Configs::getSharedConfigs(); + + if ($configs->isEmpty()) { + $configs = Configs::whereIn('name', $config_names)->get(); + } + + return self::resolveDefaultNewBucketPostRoleFlags($configs); + } + + /** + * Config群から新規バケツ作成時の投稿権限初期値を解決する。 + */ + private static function resolveDefaultNewBucketPostRoleFlags($configs): array + { + $configs = collect($configs); + + return [ + 'role_article' => (int) Configs::getConfigsValue($configs, self::DEFAULT_NEW_BUCKET_POST_ROLE_CONFIGS['role_article'], 0), + 'role_reporter' => (int) Configs::getConfigsValue($configs, self::DEFAULT_NEW_BUCKET_POST_ROLE_CONFIGS['role_reporter'], 0), + ]; + } + protected static function newFactory() { return BucketsFactory::new(); diff --git a/app/Plugins/Manage/SiteManage/SiteManage.php b/app/Plugins/Manage/SiteManage/SiteManage.php index cc10b76ab..71729c9cf 100644 --- a/app/Plugins/Manage/SiteManage/SiteManage.php +++ b/app/Plugins/Manage/SiteManage/SiteManage.php @@ -331,6 +331,20 @@ public function update($request, $page_id = null) 'value' => $request->additional_theme] ); + // 新規バケツ作成時のモデレータ投稿権限 + $configs = Configs::updateOrCreate( + ['name' => 'new_bucket_role_article_post_flag'], + ['category' => 'general', + 'value' => (isset($request->new_bucket_role_article_post_flag) ? $request->new_bucket_role_article_post_flag : 0)] + ); + + // 新規バケツ作成時の編集者投稿権限 + $configs = Configs::updateOrCreate( + ['name' => 'new_bucket_role_reporter_post_flag'], + ['category' => 'general', + 'value' => (isset($request->new_bucket_role_reporter_post_flag) ? $request->new_bucket_role_reporter_post_flag : 0)] + ); + // 画面の基本の背景色 $configs = Configs::updateOrCreate( ['name' => 'base_background_color'], diff --git a/app/Plugins/User/Bbses/BbsesPlugin.php b/app/Plugins/User/Bbses/BbsesPlugin.php index ec9d75104..2bc151456 100644 --- a/app/Plugins/User/Bbses/BbsesPlugin.php +++ b/app/Plugins/User/Bbses/BbsesPlugin.php @@ -761,7 +761,7 @@ public function saveBuckets($request, $page_id, $frame_id, $bucket_id = null) } // バケツの取得。なければ登録。 - $bucket = Buckets::updateOrCreate( + $bucket = Buckets::updateOrCreateWithDefaultPostRoles( ['id' => $bucket_id], ['bucket_name' => $request->name, 'plugin_name' => 'bbses'], ); diff --git a/app/Plugins/User/Blogs/BlogsPlugin.php b/app/Plugins/User/Blogs/BlogsPlugin.php index fa9d8ffd5..7234d454d 100644 --- a/app/Plugins/User/Blogs/BlogsPlugin.php +++ b/app/Plugins/User/Blogs/BlogsPlugin.php @@ -1333,7 +1333,7 @@ public function saveBuckets($request, $page_id, $frame_id, $blogs_id = null) // 画面から渡ってくるblogs_id が空ならバケツとブログを新規登録 if (empty($request->blogs_id)) { // バケツの登録 - $bucket = Buckets::create([ + $bucket = Buckets::createWithDefaultPostRoles([ 'bucket_name' => $request->blog_name, 'plugin_name' => 'blogs' ]); diff --git a/app/Plugins/User/Cabinets/CabinetsPlugin.php b/app/Plugins/User/Cabinets/CabinetsPlugin.php index 56efe19eb..3099b7832 100644 --- a/app/Plugins/User/Cabinets/CabinetsPlugin.php +++ b/app/Plugins/User/Cabinets/CabinetsPlugin.php @@ -1129,7 +1129,7 @@ private function getMoveValidator($request) private function saveCabinet($request, $frame_id, $bucket_id) { // バケツの取得。なければ登録。 - $bucket = Buckets::updateOrCreate( + $bucket = Buckets::updateOrCreateWithDefaultPostRoles( ['id' => $bucket_id], ['bucket_name' => $request->name, 'plugin_name' => 'cabinets'], ); diff --git a/app/Plugins/User/Calendars/CalendarsPlugin.php b/app/Plugins/User/Calendars/CalendarsPlugin.php index 36a6c914b..f25c8ae25 100644 --- a/app/Plugins/User/Calendars/CalendarsPlugin.php +++ b/app/Plugins/User/Calendars/CalendarsPlugin.php @@ -598,7 +598,7 @@ public function saveBuckets($request, $page_id, $frame_id, $bucket_id = null) } // バケツの取得。なければ登録。 - $bucket = Buckets::updateOrCreate( + $bucket = Buckets::updateOrCreateWithDefaultPostRoles( ['id' => $bucket_id], ['bucket_name' => $request->name, 'plugin_name' => 'calendars'], ); diff --git a/app/Plugins/User/Contents/ContentsPlugin.php b/app/Plugins/User/Contents/ContentsPlugin.php index 0f70a071d..c565f837e 100644 --- a/app/Plugins/User/Contents/ContentsPlugin.php +++ b/app/Plugins/User/Contents/ContentsPlugin.php @@ -550,7 +550,7 @@ public function store($request, $page_id = null, $frame_id = null, $id = null, $ // バケツがまだ登録されていなかったら登録する。 if (empty($this->buckets)) { - $bucket = Buckets::create([ + $bucket = Buckets::createWithDefaultPostRoles([ 'bucket_name' => $request->bucket_name ?? '無題', 'plugin_name' => 'contents' ]); diff --git a/app/Plugins/User/Databases/DatabasesPlugin.php b/app/Plugins/User/Databases/DatabasesPlugin.php index 6230dfa21..1de9a57ff 100644 --- a/app/Plugins/User/Databases/DatabasesPlugin.php +++ b/app/Plugins/User/Databases/DatabasesPlugin.php @@ -2136,10 +2136,10 @@ public function saveBuckets($request, $page_id, $frame_id, $databases_id = null) // 画面から渡ってくるdatabases_id が空ならバケツとブログを新規登録 if (empty($databases_id)) { // バケツの登録 - $bucket = new Buckets(); - $bucket->bucket_name = $request->databases_name; - $bucket->plugin_name = 'databases'; - $bucket->save(); + $bucket = Buckets::createWithDefaultPostRoles([ + 'bucket_name' => $request->databases_name, + 'plugin_name' => 'databases', + ]); if (empty($request->copy_databases_id)) { // 登録 @@ -2359,7 +2359,7 @@ public function destroyBuckets($request, $page_id, $frame_id, $databases_id) BucketsRoles::where('buckets_id', $databases->bucket_id)->delete(); // backetsの削除 - Buckets::where('id', $databases->bucket_id)->delete(); + Buckets::destroy($databases->bucket_id); // change: このバケツを表示している全ページのフレームのバケツIDを消す // // バケツIDの取得のためにFrame を取得(Frame を更新する前に取得しておく) diff --git a/app/Plugins/User/Faqs/FaqsPlugin.php b/app/Plugins/User/Faqs/FaqsPlugin.php index df66f21d1..779003454 100644 --- a/app/Plugins/User/Faqs/FaqsPlugin.php +++ b/app/Plugins/User/Faqs/FaqsPlugin.php @@ -961,10 +961,11 @@ public function saveBuckets($request, $page_id, $frame_id, $faqs_id = null) // 画面から渡ってくるfaqs_id が空ならバケツとFAQを新規登録 if (empty($request->faqs_id)) { // バケツの登録 - $bucket_id = DB::table('buckets')->insertGetId([ + $bucket = Buckets::createWithDefaultPostRoles([ 'bucket_name' => $request->faq_name, 'plugin_name' => 'faqs' ]); + $bucket_id = $bucket->id; // FAQデータ新規オブジェクト $faqs = new Faqs(); @@ -1043,7 +1044,7 @@ public function destroyBuckets($request, $page_id, $frame_id, $faqs_id) Frame::where('id', $frame_id)->update(['bucket_id' => null]); // backetsの削除 - Buckets::where('id', $frame->bucket_id)->delete(); + Buckets::destroy($frame->bucket_id); } // 削除処理はredirect 付のルートで呼ばれて、処理後はページの再表示が行われるため、ここでは何もしない。 } diff --git a/app/Plugins/User/Photoalbums/PhotoalbumsPlugin.php b/app/Plugins/User/Photoalbums/PhotoalbumsPlugin.php index 6bab9e2b4..59c410ca9 100644 --- a/app/Plugins/User/Photoalbums/PhotoalbumsPlugin.php +++ b/app/Plugins/User/Photoalbums/PhotoalbumsPlugin.php @@ -1833,7 +1833,7 @@ private function getContentsControlValidator($request) private function savePhotoalbum($request, $frame_id, $bucket_id) { // バケツの取得。なければ登録。 - $bucket = Buckets::updateOrCreate( + $bucket = Buckets::updateOrCreateWithDefaultPostRoles( ['id' => $bucket_id], ['bucket_name' => $request->name, 'plugin_name' => 'photoalbums'], ); diff --git a/app/Plugins/User/Reservations/ReservationsPlugin.php b/app/Plugins/User/Reservations/ReservationsPlugin.php index e5e0524bc..537df8cfb 100644 --- a/app/Plugins/User/Reservations/ReservationsPlugin.php +++ b/app/Plugins/User/Reservations/ReservationsPlugin.php @@ -1611,7 +1611,7 @@ public function saveBuckets($request, $page_id, $frame_id, $reservations_id = nu if (empty($request->reservations_id)) { // 画面から渡ってくるid が空ならバケツと施設を新規登録 // バケツの登録 - $bucket = Buckets::create([ + $bucket = Buckets::createWithDefaultPostRoles([ 'bucket_name' => $request->reservation_name, 'plugin_name' => 'reservations' ]); @@ -1701,7 +1701,7 @@ public function destroyBuckets($request, $page_id, $frame_id, $reservations_id) Frame::where('bucket_id', $reservation->bucket_id)->update(['bucket_id' => null]); // backetsの削除 - Buckets::where('id', $reservation->bucket_id)->delete(); + Buckets::destroy($reservation->bucket_id); // 施設予約を削除する。 $reservation->delete(); diff --git a/app/Plugins/User/Slideshows/SlideshowsPlugin.php b/app/Plugins/User/Slideshows/SlideshowsPlugin.php index 31d04dea6..cf4ab23ba 100644 --- a/app/Plugins/User/Slideshows/SlideshowsPlugin.php +++ b/app/Plugins/User/Slideshows/SlideshowsPlugin.php @@ -242,10 +242,10 @@ public function saveBuckets($request, $page_id, $frame_id, $slideshows_id = null /** * 新規登録用の処理 */ - $bucket = new Buckets(); - $bucket->bucket_name = '無題'; - $bucket->plugin_name = 'slideshows'; - $bucket->save(); + $bucket = Buckets::createWithDefaultPostRoles([ + 'bucket_name' => '無題', + 'plugin_name' => 'slideshows', + ]); // スライドショーデータ新規オブジェクト $slideshows = new Slideshows(); @@ -325,7 +325,7 @@ public function destroyBuckets($request, $page_id, $frame_id, $slideshows_id) $slideshows = Slideshows::find($slideshows_id); // backetsの削除 - Buckets::where('id', $slideshows->bucket_id)->delete(); + Buckets::destroy($slideshows->bucket_id); // バケツIDの取得のためにFrame を取得(Frame を更新する前に取得しておく) $frame = Frame::where('id', $frame_id)->first(); diff --git a/app/Plugins/User/UserPluginBase.php b/app/Plugins/User/UserPluginBase.php index ddc2048af..30bba27b9 100644 --- a/app/Plugins/User/UserPluginBase.php +++ b/app/Plugins/User/UserPluginBase.php @@ -615,6 +615,7 @@ public function editBucketsRoles($request, $page_id, $frame_id, $id = null, $use { // Buckets の取得 $buckets = $this->getBuckets($frame_id); + $default_post_role_flags = []; if ($this->frame->plugin_name == 'contents' || $buckets) { // 固定記事プラグイン(=コンテンツプラグイン)はバケツありなし、どちらでも表示する。 @@ -624,10 +625,15 @@ public function editBucketsRoles($request, $page_id, $frame_id, $id = null, $use return $this->commonView('empty_bucket_setting'); } + if ($this->frame->plugin_name == 'contents' && empty($buckets)) { + $default_post_role_flags = Buckets::getDefaultNewBucketPostRoleFlags(); + } + return $this->commonView('frame_edit_roles', [ - 'buckets' => $buckets, - 'plugin_name' => $this->frame->plugin_name, - 'use_approval' => $use_approval, + 'buckets' => $buckets, + 'plugin_name' => $this->frame->plugin_name, + 'use_approval' => $use_approval, + 'default_post_role_flags' => $default_post_role_flags, ]); } diff --git a/resources/views/plugins/common/frame_edit_roles.blade.php b/resources/views/plugins/common/frame_edit_roles.blade.php index 785a73f58..7f1a4e077 100644 --- a/resources/views/plugins/common/frame_edit_roles.blade.php +++ b/resources/views/plugins/common/frame_edit_roles.blade.php @@ -18,6 +18,12 @@ {{-- 登録後メッセージ表示 --}} @include('plugins.common.flash_message_for_frame') +@php + $default_post_role_flags = $default_post_role_flags ?? []; + $role_article_post_checked = $buckets ? $buckets->canPost("role_article") : !empty($default_post_role_flags['role_article']); + $role_reporter_post_checked = $buckets ? $buckets->canPost("role_reporter") : !empty($default_post_role_flags['role_reporter']); +@endphp +
plugin_name/saveBucketsRoles/$page->id/$frame_id#frame-$frame_id") }}" name="{{$frame->plugin_name}}_buckets_form" method="POST"> {{ csrf_field() }} plugin_name/editBucketsRoles/$page->id/$frame_id#frame-$frame_id") }}"> @@ -38,7 +44,7 @@ モデレータ
- @if($buckets && $buckets->canPost("role_article")) + @if($role_article_post_checked) @else @@ -64,7 +70,7 @@ 編集者
- @if($buckets && $buckets->canPost("role_reporter")) + @if($role_reporter_post_checked) @else diff --git a/resources/views/plugins/manage/site/pdf/base_main.blade.php b/resources/views/plugins/manage/site/pdf/base_main.blade.php index 6fbd7517c..5cca1e700 100644 --- a/resources/views/plugins/manage/site/pdf/base_main.blade.php +++ b/resources/views/plugins/manage/site/pdf/base_main.blade.php @@ -46,6 +46,14 @@ 基本レイアウト {{$base_layout_title}} + + プラグイン新規作成時のモデレータ投稿権限 + @if (Configs::getConfigsValue($configs, 'new_bucket_role_article_post_flag', 0) == '1') 許可する @else 許可しない @endif + + + プラグイン新規作成時の編集者投稿権限 + @if (Configs::getConfigsValue($configs, 'new_bucket_role_reporter_post_flag', 0) == '1') 許可する @else 許可しない @endif + 背景色 {{Configs::getConfigsValue($configs, 'base_background_color', null)}} diff --git a/resources/views/plugins/manage/site/site.blade.php b/resources/views/plugins/manage/site/site.blade.php index d1508d81f..763143c01 100644 --- a/resources/views/plugins/manage/site/site.blade.php +++ b/resources/views/plugins/manage/site/site.blade.php @@ -551,6 +551,34 @@ class="custom-control-input"
+ {{-- プラグイン新規作成時の投稿権限 --}} +
+ +

+ 掲示板やブログなどを新しく作成したとき、投稿を許可する権限の初期値です。 + 既存のプラグイン設定は変更されません。 +

+
+
+ @if(Configs::getConfigsValueAndOld($configs, "new_bucket_role_article_post_flag", 0) == 1) + + @else + + @endif + +
+
+ @if(Configs::getConfigsValueAndOld($configs, "new_bucket_role_reporter_post_flag", 0) == 1) + + @else + + @endif + +
+
+ 作成後は、各プラグインの権限設定で個別に変更できます。 +
+ {{-- Submitボタン --}}
diff --git a/tests/Feature/Plugins/Manage/SiteManage/SiteManageNewBucketDefaultRolesTest.php b/tests/Feature/Plugins/Manage/SiteManage/SiteManageNewBucketDefaultRolesTest.php new file mode 100644 index 000000000..c606d4627 --- /dev/null +++ b/tests/Feature/Plugins/Manage/SiteManage/SiteManageNewBucketDefaultRolesTest.php @@ -0,0 +1,199 @@ +seed(); + } + + /** + * 未設定状態では両方のチェックボックスが未チェックで表示されること。 + */ + public function testIndexShowsBothCheckboxesUncheckedWhenConfigsAreMissing(): void + { + $admin = $this->createSiteAdminUser(); + + $response = $this->actingAs($admin)->get('/manage/site'); + + $response->assertOk(); + $response->assertSee('プラグイン新規作成時の投稿権限'); + $response->assertDontSee('id="new_bucket_role_article_post_flag" class="custom-control-input" checked="checked"', false); + $response->assertDontSee('id="new_bucket_role_reporter_post_flag" class="custom-control-input" checked="checked"', false); + } + + /** + * 保存済みの設定があれば、画面のチェック状態へ反映されること。 + */ + public function testIndexShowsSavedFlagValues(): void + { + $admin = $this->createSiteAdminUser(); + $this->setDefaultPostRoleConfigs(1, 0); + + $response = $this->actingAs($admin)->get('/manage/site'); + + $response->assertOk(); + $response->assertSee('id="new_bucket_role_article_post_flag" class="custom-control-input" checked="checked"', false); + $response->assertDontSee('id="new_bucket_role_reporter_post_flag" class="custom-control-input" checked="checked"', false); + } + + /** + * 両方ONで保存した設定がConfigに反映され、再表示時にも維持されること。 + */ + public function testUpdateCanSaveBothFlagsAsEnabled(): void + { + $admin = $this->createSiteAdminUser(); + + $response = $this->actingAs($admin)->post('/manage/site/update', $this->buildBasePayload([ + 'new_bucket_role_article_post_flag' => 1, + 'new_bucket_role_reporter_post_flag' => 1, + ])); + + $response->assertRedirect('/manage/site'); + $this->assertDatabaseHas('configs', [ + 'name' => 'new_bucket_role_article_post_flag', + 'category' => 'general', + 'value' => '1', + ]); + $this->assertDatabaseHas('configs', [ + 'name' => 'new_bucket_role_reporter_post_flag', + 'category' => 'general', + 'value' => '1', + ]); + } + + /** + * 片方だけONでも保存でき、画面再表示も保存内容に追従すること。 + */ + public function testUpdateCanSaveOnlyOneFlagAsEnabled(): void + { + $admin = $this->createSiteAdminUser(); + + $response = $this->actingAs($admin)->post('/manage/site/update', $this->buildBasePayload([ + 'new_bucket_role_article_post_flag' => 1, + ])); + + $response->assertRedirect('/manage/site'); + $this->assertDatabaseHas('configs', [ + 'name' => 'new_bucket_role_article_post_flag', + 'category' => 'general', + 'value' => '1', + ]); + $this->assertDatabaseHas('configs', [ + 'name' => 'new_bucket_role_reporter_post_flag', + 'category' => 'general', + 'value' => '0', + ]); + } + + /** + * 一度ONにした設定を外して保存すると、Configが0に戻ること。 + */ + public function testUpdateCanTurnFlagsOffAgain(): void + { + $admin = $this->createSiteAdminUser(); + $this->setDefaultPostRoleConfigs(1, 1); + + $response = $this->actingAs($admin)->post('/manage/site/update', $this->buildBasePayload()); + + $response->assertRedirect('/manage/site'); + $this->assertDatabaseHas('configs', [ + 'name' => 'new_bucket_role_article_post_flag', + 'category' => 'general', + 'value' => '0', + ]); + $this->assertDatabaseHas('configs', [ + 'name' => 'new_bucket_role_reporter_post_flag', + 'category' => 'general', + 'value' => '0', + ]); + } + + /** + * サイト管理者権限を持つユーザーを作成する。 + */ + private function createSiteAdminUser(): User + { + $user = User::factory()->create(); + + UsersRoles::factory()->create([ + 'users_id' => $user->id, + 'target' => 'manage', + 'role_name' => 'admin_site', + 'role_value' => 1, + ]); + + return $user; + } + + /** + * プラグイン新規作成時用の投稿権限Configを保存する。 + */ + private function setDefaultPostRoleConfigs(int $articleFlag, int $reporterFlag): void + { + Configs::updateOrCreate( + ['name' => 'new_bucket_role_article_post_flag'], + ['category' => 'general', 'value' => $articleFlag] + ); + Configs::updateOrCreate( + ['name' => 'new_bucket_role_reporter_post_flag'], + ['category' => 'general', 'value' => $reporterFlag] + ); + } + + /** + * サイト基本設定更新に必要な最低限の入力値を組み立てる。 + */ + private function buildBasePayload(array $overrides = []): array + { + return array_merge([ + 'base_site_name' => 'テストサイト', + 'base_theme' => '', + 'base_layout' => '0|0|0|0', + 'additional_theme' => '', + 'base_background_color' => '', + 'base_header_color' => '', + 'base_header_font_color_class' => BaseHeaderFontColorClass::navbar_dark, + 'base_header_optional_class' => '', + 'body_optional_class' => '', + 'center_area_optional_class' => '', + 'footer_area_optional_class' => '', + 'base_header_hidden' => 0, + 'base_header_login_link' => 0, + 'base_login_password_reset' => 0, + 'base_login_redirect_previous_page' => BaseLoginRedirectPage::top_page, + 'base_login_redirect_select_page' => '', + 'use_mypage' => 0, + 'mypage_top_notice' => '', + 'mypage_bottom_notice' => '', + 'smartphone_menu_template' => SmartphoneMenuTemplateType::none, + ], $overrides); + } +} diff --git a/tests/Feature/Plugins/User/Bbses/BbsesDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Bbses/BbsesDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..a48075cba --- /dev/null +++ b/tests/Feature/Plugins/User/Bbses/BbsesDefaultBucketRolesFeatureTest.php @@ -0,0 +1,85 @@ +seed(); + } + + /** + * 新規作成時は、サイト管理の初期値どおりにBucketsRolesが作られること。 + */ + public function testSaveBucketsCreatesDefaultRolesOnlyOnNewBucket(): void + { + $this->assertSaveBucketsCreatesDefaultRoles('bbses', [ + 'name' => '掲示板テスト', + 'use_like' => 0, + 'like_button_name' => '', + ], 1, 0); + } + + /** + * 既存バケツ更新では新規初期化を走らせず、既存権限も上書きしないこと。 + */ + public function testSaveBucketsDoesNotInitializeRolesOnExistingBucketUpdate(): void + { + $admin = $this->createContentAdminUser(); + [$page, $frame] = $this->createPluginFrame('bbses'); + $bucket = Buckets::factory()->create([ + 'bucket_name' => '既存掲示板', + 'plugin_name' => 'bbses', + ]); + $frame->update(['bucket_id' => $bucket->id]); + BucketsRoles::create([ + 'buckets_id' => $bucket->id, + 'role' => 'role_article', + 'post_flag' => 0, + 'approval_flag' => 1, + ]); + $this->setDefaultPostRoleConfigs(1, 1); + + $response = $this->actingAs($admin)->post("/redirect/plugin/bbses/saveBuckets/{$page->id}/{$frame->id}/{$bucket->id}", [ + 'redirect_path' => url("/plugin/bbses/editBuckets/{$page->id}/{$frame->id}#frame-{$frame->id}"), + 'name' => '既存掲示板を更新', + 'use_like' => 0, + 'like_button_name' => '', + ]); + + $response->assertStatus(302); + + $this->assertDatabaseCount('buckets_roles', 1); + $this->assertDatabaseHas('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_article', + 'post_flag' => 0, + 'approval_flag' => 1, + ]); + $this->assertDatabaseMissing('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_reporter', + ]); + } +} diff --git a/tests/Feature/Plugins/User/Blogs/BlogsDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Blogs/BlogsDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..543ef355f --- /dev/null +++ b/tests/Feature/Plugins/User/Blogs/BlogsDefaultBucketRolesFeatureTest.php @@ -0,0 +1,48 @@ +seed(); + } + + /** + * ブログ新規作成では、サイト管理の初期値どおりの投稿権限が作られること。 + */ + public function testSaveBucketsCreatesDefaultRolesOnBlogCreation(): void + { + $this->assertSaveBucketsCreatesDefaultRoles('blogs', [ + 'blogs_id' => '', + 'blog_name' => 'ブログテスト', + 'rss' => 0, + 'rss_count' => 10, + 'use_like' => 0, + 'like_button_name' => '', + 'use_view_count_spectator' => 0, + 'narrowing_down_type' => 0, + 'narrowing_down_type_for_created_id' => 0, + 'narrowing_down_type_for_posted_month' => 0, + ]); + } +} diff --git a/tests/Feature/Plugins/User/Cabinets/CabinetsDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Cabinets/CabinetsDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..c4177ceef --- /dev/null +++ b/tests/Feature/Plugins/User/Cabinets/CabinetsDefaultBucketRolesFeatureTest.php @@ -0,0 +1,40 @@ +seed(); + } + + /** + * キャビネット新規作成では、サイト管理の初期値どおりの投稿権限が作られること。 + */ + public function testSaveBucketsCreatesDefaultRolesOnCabinetCreation(): void + { + $this->assertSaveBucketsCreatesDefaultRoles('cabinets', [ + 'name' => 'キャビネットテスト', + 'upload_max_size' => '2048', + ]); + } +} diff --git a/tests/Feature/Plugins/User/Calendars/CalendarsDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Calendars/CalendarsDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..e60c90742 --- /dev/null +++ b/tests/Feature/Plugins/User/Calendars/CalendarsDefaultBucketRolesFeatureTest.php @@ -0,0 +1,39 @@ +seed(); + } + + /** + * カレンダー新規作成では、サイト管理の初期値どおりの投稿権限が作られること。 + */ + public function testSaveBucketsCreatesDefaultRolesOnCalendarCreation(): void + { + $this->assertSaveBucketsCreatesDefaultRoles('calendars', [ + 'name' => 'カレンダーテスト', + ]); + } +} diff --git a/tests/Feature/Plugins/User/Contents/ContentsDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Contents/ContentsDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..a85e069b8 --- /dev/null +++ b/tests/Feature/Plugins/User/Contents/ContentsDefaultBucketRolesFeatureTest.php @@ -0,0 +1,84 @@ +seed(); + } + + /** + * バケツ未作成の権限画面では、サイト管理の初期値をチェック状態に反映すること。 + */ + public function testEditBucketsRolesShowsSiteDefaultsBeforeBucketExists(): void + { + $admin = $this->createContentAdminUser(); + [$page, $frame] = $this->createPluginFrame('contents'); + $this->setDefaultPostRoleConfigs(1, 0); + + $response = $this->actingAs($admin)->get("/plugin/contents/editBucketsRoles/{$page->id}/{$frame->id}"); + + $response->assertOk(); + $response->assertSee('id="role_article_post" checked="checked"', false); + $response->assertDontSee('id="role_reporter_post" checked="checked"', false); + } + + /** + * サイト管理の初期値が両方OFFなら、未作成バケツの画面でも未チェック表示になること。 + */ + public function testEditBucketsRolesShowsUncheckedWhenSiteDefaultsAreOff(): void + { + $admin = $this->createContentAdminUser(); + [$page, $frame] = $this->createPluginFrame('contents'); + $this->setDefaultPostRoleConfigs(0, 0); + + $response = $this->actingAs($admin)->get("/plugin/contents/editBucketsRoles/{$page->id}/{$frame->id}"); + + $response->assertOk(); + $response->assertDontSee('id="role_article_post" checked="checked"', false); + $response->assertDontSee('id="role_reporter_post" checked="checked"', false); + } + + /** + * 初回投稿で作られるバケツには、サイト管理の初期値どおりの投稿権限だけが作られること。 + */ + public function testFirstStoreCreatesBucketsRolesFromSiteDefaults(): void + { + $admin = $this->createContentAdminUser(); + [$page, $frame] = $this->createPluginFrame('contents'); + $this->setDefaultPostRoleConfigs(1, 0); + + $response = $this->actingAs($admin)->post("/redirect/plugin/contents/store/{$page->id}/{$frame->id}", [ + 'redirect_path' => url("/plugin/contents/edit/{$page->id}/{$frame->id}#frame-{$frame->id}"), + 'contents' => '初回投稿本文', + 'bucket_name' => '固定記事テスト', + ]); + + $response->assertStatus(302); + + $bucket = Buckets::query()->findOrFail($frame->fresh()->bucket_id); + $this->assertFrameUsesBucket($frame, $bucket); + $this->assertDefaultPostRolesForBucket($bucket, 1, 0); + } +} diff --git a/tests/Feature/Plugins/User/Databases/DatabasesDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Databases/DatabasesDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..7b9c7a15d --- /dev/null +++ b/tests/Feature/Plugins/User/Databases/DatabasesDefaultBucketRolesFeatureTest.php @@ -0,0 +1,56 @@ +seed(); + } + + /** + * データベース新規作成では、サイト管理の初期値どおりの投稿権限が作られること。 + */ + public function testSaveBucketsCreatesDefaultRolesOnDatabaseCreation(): void + { + $this->assertSaveBucketsCreatesDefaultRoles('databases', [ + 'databases_name' => 'データベーステスト', + 'copy_databases_id' => '', + 'posted_role_display_control_flag' => 0, + 'search_results_empty_message' => '', + 'use_like' => 0, + 'like_button_name' => '', + 'mail_send_flag' => 0, + 'mail_send_address' => '', + 'user_mail_send_flag' => 0, + 'from_mail_name' => '', + 'mail_subject' => '', + 'mail_databaseat' => '', + 'data_save_flag' => 0, + 'after_message' => '', + 'numbering_use_flag' => 0, + 'numbering_prefix' => '', + 'save_searched_word' => 0, + 'full_text_search' => 0, + ]); + } +} diff --git a/tests/Feature/Plugins/User/DefaultBucketRolesFeatureTestTrait.php b/tests/Feature/Plugins/User/DefaultBucketRolesFeatureTestTrait.php new file mode 100644 index 000000000..d5dca21a7 --- /dev/null +++ b/tests/Feature/Plugins/User/DefaultBucketRolesFeatureTestTrait.php @@ -0,0 +1,146 @@ +createContentAdminUser(); + [$page, $frame] = $this->createPluginFrame($plugin_name); + $this->setDefaultPostRoleConfigs($article_flag, $reporter_flag); + + $response = $this->actingAs($admin)->post( + "/redirect/plugin/{$plugin_name}/saveBuckets/{$page->id}/{$frame->id}", + array_merge( + [ + 'redirect_path' => url("/plugin/{$plugin_name}/createBuckets/{$page->id}/{$frame->id}#frame-{$frame->id}"), + ], + $payload + ) + ); + + $this->assertContains($response->getStatusCode(), [200, 302]); + + $bucket = Buckets::query() + ->where('plugin_name', $plugin_name) + ->latest('id') + ->firstOrFail(); + + $this->assertFrameUsesBucket($frame, $bucket); + $this->assertDefaultPostRolesForBucket($bucket, $article_flag, $reporter_flag); + } + + /** + * フレームが作成されたバケツを表示対象にしていることを検証する。 + */ + protected function assertFrameUsesBucket(Frame $frame, Buckets $bucket): void + { + $this->assertDatabaseHas('frames', [ + 'id' => $frame->id, + 'bucket_id' => $bucket->id, + ]); + } + + /** + * 指定バケツに、サイト管理の初期値どおりの投稿権限が作られたことを検証する。 + */ + protected function assertDefaultPostRolesForBucket(Buckets $bucket, int $article_flag, int $reporter_flag): void + { + $this->assertDefaultPostRoleForBucket($bucket, 'role_article', $article_flag); + $this->assertDefaultPostRoleForBucket($bucket, 'role_reporter', $reporter_flag); + } + + /** + * 指定ロールの投稿権限が、初期値ONなら存在し、OFFなら存在しないことを検証する。 + */ + private function assertDefaultPostRoleForBucket(Buckets $bucket, string $role, int $post_flag): void + { + if ($post_flag === 1) { + $this->assertDatabaseHas('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => $role, + 'post_flag' => 1, + 'approval_flag' => 0, + ]); + return; + } + + $this->assertDatabaseMissing('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => $role, + ]); + } + + /** + * コンテンツ管理者権限を持つユーザーを作成する。 + */ + protected function createContentAdminUser(): User + { + $user = User::factory()->create(); + + UsersRoles::factory()->create([ + 'users_id' => $user->id, + 'target' => 'base', + 'role_name' => 'role_article_admin', + 'role_value' => 1, + ]); + + return $user; + } + + /** + * バケツ未作成のプラグインフレームを作成する。 + * + * @return array{0: \App\Models\Common\Page, 1: \App\Models\Common\Frame} + */ + protected function createPluginFrame(string $plugin_name): array + { + $page = Page::factory()->create(); + $frame = Frame::create([ + 'page_id' => $page->id, + 'area_id' => 2, + 'plugin_name' => $plugin_name, + 'bucket_id' => null, + 'template' => 'default', + 'display_sequence' => 1, + ]); + + return [$page, $frame]; + } + + /** + * 新規バケツ用の投稿権限Configを保存する。 + */ + protected function setDefaultPostRoleConfigs(int $article_flag, int $reporter_flag): void + { + Configs::updateOrCreate( + ['name' => 'new_bucket_role_article_post_flag'], + ['category' => 'general', 'value' => $article_flag] + ); + Configs::updateOrCreate( + ['name' => 'new_bucket_role_reporter_post_flag'], + ['category' => 'general', 'value' => $reporter_flag] + ); + } +} diff --git a/tests/Feature/Plugins/User/Faqs/FaqsDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Faqs/FaqsDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..d7fdb134c --- /dev/null +++ b/tests/Feature/Plugins/User/Faqs/FaqsDefaultBucketRolesFeatureTest.php @@ -0,0 +1,45 @@ +seed(); + } + + /** + * FAQ新規作成では、サイト管理の初期値どおりの投稿権限が作られること。 + */ + public function testSaveBucketsCreatesDefaultRolesOnFaqCreation(): void + { + $this->assertSaveBucketsCreatesDefaultRoles('faqs', [ + 'faqs_id' => '', + 'faq_name' => 'FAQテスト', + 'view_count' => 10, + 'rss' => 0, + 'rss_count' => 0, + 'sequence_conditions' => 0, + 'display_posted_at_flag' => 0, + ], 1, 0); + } +} diff --git a/tests/Feature/Plugins/User/Photoalbums/PhotoalbumsDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Photoalbums/PhotoalbumsDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..f0d5d1cfd --- /dev/null +++ b/tests/Feature/Plugins/User/Photoalbums/PhotoalbumsDefaultBucketRolesFeatureTest.php @@ -0,0 +1,42 @@ +seed(); + } + + /** + * フォトアルバム新規作成では、サイト管理の初期値どおりの投稿権限が作られること。 + */ + public function testSaveBucketsCreatesDefaultRolesOnPhotoalbumCreation(): void + { + $this->assertSaveBucketsCreatesDefaultRoles('photoalbums', [ + 'name' => 'フォトアルバムテスト', + 'image_upload_max_size' => '2048', + 'image_upload_max_px' => 'asis', + 'video_upload_max_size' => '2048', + ]); + } +} diff --git a/tests/Feature/Plugins/User/Reservations/ReservationsDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Reservations/ReservationsDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..3f2b3d9d4 --- /dev/null +++ b/tests/Feature/Plugins/User/Reservations/ReservationsDefaultBucketRolesFeatureTest.php @@ -0,0 +1,40 @@ +seed(); + } + + /** + * 施設予約新規作成では、サイト管理の初期値どおりの投稿権限が作られること。 + */ + public function testSaveBucketsCreatesDefaultRolesOnReservationCreation(): void + { + $this->assertSaveBucketsCreatesDefaultRoles('reservations', [ + 'reservations_id' => '', + 'reservation_name' => '施設予約テスト', + ]); + } +} diff --git a/tests/Feature/Plugins/User/Slideshows/SlideshowsDefaultBucketRolesFeatureTest.php b/tests/Feature/Plugins/User/Slideshows/SlideshowsDefaultBucketRolesFeatureTest.php new file mode 100644 index 000000000..77d857a50 --- /dev/null +++ b/tests/Feature/Plugins/User/Slideshows/SlideshowsDefaultBucketRolesFeatureTest.php @@ -0,0 +1,44 @@ +seed(); + } + + /** + * スライドショー新規作成では、サイト管理の初期値どおりの投稿権限が作られること。 + */ + public function testSaveBucketsCreatesDefaultRolesOnSlideshowCreation(): void + { + $this->assertSaveBucketsCreatesDefaultRoles('slideshows', [ + 'slideshows_name' => 'スライドショーテスト', + 'control_display_flag' => 0, + 'indicators_display_flag' => 0, + 'fade_use_flag' => 0, + 'image_interval' => 5000, + 'height' => '', + ]); + } +} diff --git a/tests/Unit/Models/Common/BucketsDefaultPostRolesTest.php b/tests/Unit/Models/Common/BucketsDefaultPostRolesTest.php new file mode 100644 index 000000000..a501dff56 --- /dev/null +++ b/tests/Unit/Models/Common/BucketsDefaultPostRolesTest.php @@ -0,0 +1,283 @@ +clearSharedConfigsFromRequest(); + } + + /** + * Config未登録の環境では既存挙動を保ち、初期権限を追加しないこと。 + */ + public function testInitializeDefaultPostRolesDoesNotCreateRolesWhenConfigIsMissing(): void + { + $bucket = $this->createBucket(); + + $bucket->initializeDefaultPostRoles(); + + $this->assertDatabaseCount('buckets_roles', 0); + } + + /** + * モデレータだけONなら、そのロールだけに投稿権限を初期投入すること。 + */ + public function testInitializeDefaultPostRolesCreatesOnlyArticleRoleWhenEnabled(): void + { + $bucket = $this->createBucket(); + $this->setDefaultPostRoleConfigs(1, 0); + + $bucket->initializeDefaultPostRoles(); + + $this->assertDatabaseHas('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_article', + 'post_flag' => 1, + 'approval_flag' => 0, + ]); + $this->assertDatabaseMissing('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_reporter', + ]); + } + + /** + * 編集者だけONなら、そのロールだけに投稿権限を初期投入すること。 + */ + public function testInitializeDefaultPostRolesCreatesOnlyReporterRoleWhenEnabled(): void + { + $bucket = $this->createBucket(); + $this->setDefaultPostRoleConfigs(0, 1); + + $bucket->initializeDefaultPostRoles(); + + $this->assertDatabaseHas('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_reporter', + 'post_flag' => 1, + 'approval_flag' => 0, + ]); + $this->assertDatabaseMissing('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_article', + ]); + } + + /** + * 両方ONなら、対象2ロールの初期権限をまとめて作成すること。 + */ + public function testInitializeDefaultPostRolesCreatesBothRolesWhenEnabled(): void + { + $bucket = $this->createBucket(); + $this->setDefaultPostRoleConfigs(1, 1); + + $bucket->initializeDefaultPostRoles(); + + $this->assertDatabaseCount('buckets_roles', 2); + $this->assertDatabaseHas('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_article', + 'post_flag' => 1, + 'approval_flag' => 0, + ]); + $this->assertDatabaseHas('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_reporter', + 'post_flag' => 1, + 'approval_flag' => 0, + ]); + } + + /** + * 同じ初期化を繰り返しても、権限レコードが重複しないこと。 + */ + public function testInitializeDefaultPostRolesIsIdempotent(): void + { + $bucket = $this->createBucket(); + $this->setDefaultPostRoleConfigs(1, 1); + + $bucket->initializeDefaultPostRoles(); + $bucket->initializeDefaultPostRoles(); + + $this->assertDatabaseCount('buckets_roles', 2); + } + + /** + * 既存のBucketsRolesがある場合は、その設定を勝手に上書きしないこと。 + */ + public function testInitializeDefaultPostRolesDoesNotOverwriteExistingRole(): void + { + $bucket = $this->createBucket(); + $this->setDefaultPostRoleConfigs(1, 0); + + BucketsRoles::create([ + 'buckets_id' => $bucket->id, + 'role' => 'role_article', + 'post_flag' => 0, + 'approval_flag' => 1, + ]); + + $bucket->initializeDefaultPostRoles(); + + $this->assertDatabaseCount('buckets_roles', 1); + $this->assertDatabaseHas('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_article', + 'post_flag' => 0, + 'approval_flag' => 1, + ]); + } + + /** + * 共通作成APIでは、投稿権限設定を持つプラグインだけ初期権限を作成すること。 + */ + public function testCreateWithDefaultPostRolesAppliesOnlyTargetPlugin(): void + { + $this->setDefaultPostRoleConfigs(1, 1); + + $target_bucket = Buckets::createWithDefaultPostRoles([ + 'bucket_name' => '対象掲示板', + 'plugin_name' => 'bbses', + ]); + $non_target_bucket = Buckets::createWithDefaultPostRoles([ + 'bucket_name' => '対象外リンクリスト', + 'plugin_name' => 'linklists', + ]); + + $this->assertDatabaseHas('buckets_roles', [ + 'buckets_id' => $target_bucket->id, + 'role' => 'role_article', + 'post_flag' => 1, + ]); + $this->assertDatabaseHas('buckets_roles', [ + 'buckets_id' => $target_bucket->id, + 'role' => 'role_reporter', + 'post_flag' => 1, + ]); + $this->assertDatabaseMissing('buckets_roles', [ + 'buckets_id' => $non_target_bucket->id, + ]); + } + + /** + * 共通更新APIでは、新規作成時だけ初期権限を作成し、既存バケツ更新では作成しないこと。 + */ + public function testUpdateOrCreateWithDefaultPostRolesAppliesOnlyWhenCreated(): void + { + $this->setDefaultPostRoleConfigs(1, 0); + + $bucket = Buckets::updateOrCreateWithDefaultPostRoles( + ['id' => null], + ['bucket_name' => '新規ブログ', 'plugin_name' => 'blogs'] + ); + BucketsRoles::query()->delete(); + + Buckets::updateOrCreateWithDefaultPostRoles( + ['id' => $bucket->id], + ['bucket_name' => '更新ブログ', 'plugin_name' => 'blogs'] + ); + + $this->assertDatabaseCount('buckets_roles', 0); + } + + /** + * 対象プラグインの判定は、権限設定タブを持つ代表プラグインだけを対象にすること。 + */ + public function testIsDefaultPostRoleTargetPlugin(): void + { + $this->assertTrue(Buckets::isDefaultPostRoleTargetPlugin('bbses')); + $this->assertTrue(Buckets::isDefaultPostRoleTargetPlugin('databases')); + $this->assertFalse(Buckets::isDefaultPostRoleTargetPlugin('learningtasks')); + $this->assertFalse(Buckets::isDefaultPostRoleTargetPlugin('linklists')); + $this->assertFalse(Buckets::isDefaultPostRoleTargetPlugin('whatsnews')); + $this->assertFalse(Buckets::isDefaultPostRoleTargetPlugin(null)); + } + + /** + * Buckets削除時は関連するBucketsRolesも同時に片づけること。 + */ + public function testDestroyRemovesRelatedBucketsRoles(): void + { + $bucket = $this->createBucket(); + BucketsRoles::create([ + 'buckets_id' => $bucket->id, + 'role' => 'role_article', + 'post_flag' => 1, + 'approval_flag' => 0, + ]); + BucketsRoles::create([ + 'buckets_id' => $bucket->id, + 'role' => 'role_reporter', + 'post_flag' => 1, + 'approval_flag' => 0, + ]); + + Buckets::destroy($bucket->id); + + $this->assertDatabaseMissing('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_article', + ]); + $this->assertDatabaseMissing('buckets_roles', [ + 'buckets_id' => $bucket->id, + 'role' => 'role_reporter', + ]); + } + + /** + * テスト対象のバケツを1件作成する。 + */ + private function createBucket(): Buckets + { + return Buckets::factory()->create([ + 'plugin_name' => 'contents', + ]); + } + + /** + * 新規バケツ用の投稿権限Configを保存する。 + */ + private function setDefaultPostRoleConfigs(int $article_flag, int $reporter_flag): void + { + Configs::updateOrCreate( + ['name' => 'new_bucket_role_article_post_flag'], + ['category' => 'general', 'value' => $article_flag] + ); + Configs::updateOrCreate( + ['name' => 'new_bucket_role_reporter_post_flag'], + ['category' => 'general', 'value' => $reporter_flag] + ); + + $this->clearSharedConfigsFromRequest(); + } + + /** + * Request属性の共有Configを外し、DBフォールバックの条件をそろえる。 + */ + private function clearSharedConfigsFromRequest(): void + { + app(Request::class)->attributes->remove('configs'); + } +}