147 lines
8.6 KiB
PHP
147 lines
8.6 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature\Database;
|
|
|
|
use App\Actions\Projects\DuplicateProjectConfiguration;
|
|
use Illuminate\Support\Facades\Artisan;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Tests\TestCase;
|
|
|
|
class ProjectTemplateBaselineMigrationTest extends TestCase
|
|
{
|
|
public function test_migration_backfills_hidden_base_templates_for_existing_projects(): void
|
|
{
|
|
Artisan::call('migrate:fresh', [
|
|
'--path' => [
|
|
'database/migrations/0001_01_01_000000_create_users_table.php',
|
|
'database/migrations/0001_01_01_000001_create_cache_table.php',
|
|
'database/migrations/0001_01_01_000002_create_jobs_table.php',
|
|
'database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php',
|
|
'database/migrations/2026_03_24_234007_create_projects_table.php',
|
|
'database/migrations/2026_03_24_234734_create_teams_table.php',
|
|
'database/migrations/2026_03_24_234735_create_team_user_table.php',
|
|
'database/migrations/2026_03_25_002100_create_board_columns_table.php',
|
|
'database/migrations/2026_03_25_003100_create_ticket_types_table.php',
|
|
'database/migrations/2026_03_25_003101_create_ticket_priorities_table.php',
|
|
'database/migrations/2026_03_25_003102_create_ticket_field_definitions_table.php',
|
|
'database/migrations/2026_03_25_004098_create_ticket_statuses_table.php',
|
|
'database/migrations/2026_03_25_004099_create_ticket_statuses_transitionstable.php',
|
|
'database/migrations/2026_03_25_004100_create_tickets_table.php',
|
|
'database/migrations/2026_03_25_065302_create_ticket_worklog_entries_table.php',
|
|
'database/migrations/2026_03_25_070706_create_ticket_field_values_table.php',
|
|
'database/migrations/2026_03_25_073715_create_ticket_links_table.php',
|
|
'database/migrations/2026_03_25_073715_create_ticket_link_types_table.php',
|
|
'database/migrations/2026_03_26_074522_create_user_git_connections_table.php',
|
|
'database/migrations/2026_03_26_075849_create_repository_connections_table.php',
|
|
'database/migrations/2026_04_12_120000_create_permission_assignments_table.php',
|
|
'database/migrations/2026_04_20_174556_create_user_applications_table.php',
|
|
'database/migrations/2026_04_20_194646_create_notification_actions_table.php',
|
|
'database/migrations/2026_04_20_194646_create_notification_delivery_logs_table.php',
|
|
'database/migrations/2026_04_24_194800_add_filters_to_notification_actions_table.php',
|
|
'database/migrations/2026_04_24_203500_create_acceptance_criteria_table.php',
|
|
'database/migrations/2026_05_19_230500_drop_acceptance_criteria_from_tickets_table.php',
|
|
'database/migrations/2026_05_22_124700_add_must_change_password_on_next_login_to_users_table.php',
|
|
'database/migrations/2026_05_23_101900_add_counterpart_label_to_ticket_link_types_table.php',
|
|
'database/migrations/2026_05_25_011500_create_project_templates_table.php',
|
|
],
|
|
]);
|
|
|
|
DB::table('projects')->insert([
|
|
'name' => 'Legacy Project',
|
|
'key' => 'LGCY',
|
|
'show_author' => 0,
|
|
'show_story_points' => 1,
|
|
'created_at' => now(),
|
|
'updated_at' => now(),
|
|
]);
|
|
|
|
$projectId = (int) DB::table('projects')->where('key', 'LGCY')->value('id');
|
|
|
|
Artisan::call('migrate', [
|
|
'--path' => 'database/migrations/2026_05_25_013000_project_templates_as_project_baselines.php',
|
|
]);
|
|
|
|
$project = DB::table('projects')->where('id', $projectId)->first();
|
|
$template = DB::table('project_templates')->where('id', $project->project_template_id)->first();
|
|
|
|
$this->assertNotNull($project->project_template_id);
|
|
$this->assertNotNull($template);
|
|
$this->assertSame($projectId, $template->project_id);
|
|
$this->assertSame($projectId, $template->source_project_id);
|
|
$this->assertSame(0, $template->is_published);
|
|
$this->assertSame('lgcy-base-template', $template->slug);
|
|
}
|
|
|
|
public function test_metadata_migration_moves_existing_configuration_to_the_project_template_and_preserves_snapshot(): void
|
|
{
|
|
Artisan::call('migrate:fresh', [
|
|
'--path' => [
|
|
'database/migrations/0001_01_01_000000_create_users_table.php',
|
|
'database/migrations/0001_01_01_000001_create_cache_table.php',
|
|
'database/migrations/0001_01_01_000002_create_jobs_table.php',
|
|
'database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php',
|
|
'database/migrations/2026_03_24_234007_create_projects_table.php',
|
|
'database/migrations/2026_03_24_234734_create_teams_table.php',
|
|
'database/migrations/2026_03_24_234735_create_team_user_table.php',
|
|
'database/migrations/2026_03_25_002100_create_board_columns_table.php',
|
|
'database/migrations/2026_03_25_003100_create_ticket_types_table.php',
|
|
'database/migrations/2026_03_25_003101_create_ticket_priorities_table.php',
|
|
'database/migrations/2026_03_25_003102_create_ticket_field_definitions_table.php',
|
|
'database/migrations/2026_03_25_004098_create_ticket_statuses_table.php',
|
|
'database/migrations/2026_03_25_004099_create_ticket_statuses_transitionstable.php',
|
|
'database/migrations/2026_03_25_004100_create_tickets_table.php',
|
|
'database/migrations/2026_03_25_065302_create_ticket_worklog_entries_table.php',
|
|
'database/migrations/2026_03_25_070706_create_ticket_field_values_table.php',
|
|
'database/migrations/2026_03_25_073715_create_ticket_links_table.php',
|
|
'database/migrations/2026_03_25_073715_create_ticket_link_types_table.php',
|
|
'database/migrations/2026_03_26_074522_create_user_git_connections_table.php',
|
|
'database/migrations/2026_03_26_075849_create_repository_connections_table.php',
|
|
'database/migrations/2026_04_12_120000_create_permission_assignments_table.php',
|
|
'database/migrations/2026_04_20_174556_create_user_applications_table.php',
|
|
'database/migrations/2026_04_20_194646_create_notification_actions_table.php',
|
|
'database/migrations/2026_04_20_194646_create_notification_delivery_logs_table.php',
|
|
'database/migrations/2026_04_24_194800_add_filters_to_notification_actions_table.php',
|
|
'database/migrations/2026_04_24_203500_create_acceptance_criteria_table.php',
|
|
'database/migrations/2026_05_19_230500_drop_acceptance_criteria_from_tickets_table.php',
|
|
'database/migrations/2026_05_22_124700_add_must_change_password_on_next_login_to_users_table.php',
|
|
'database/migrations/2026_05_23_101900_add_counterpart_label_to_ticket_link_types_table.php',
|
|
'database/migrations/2026_05_25_011500_create_project_templates_table.php',
|
|
'database/migrations/2026_05_25_013000_project_templates_as_project_baselines.php',
|
|
],
|
|
]);
|
|
|
|
DB::table('projects')->insert([
|
|
'name' => 'Legacy Project',
|
|
'key' => 'LGCY',
|
|
'show_author' => 0,
|
|
'show_story_points' => 1,
|
|
'project_template_id' => null,
|
|
'created_at' => now(),
|
|
'updated_at' => now(),
|
|
]);
|
|
|
|
$projectId = (int) DB::table('projects')->where('key', 'LGCY')->value('id');
|
|
|
|
DB::table('ticket_types')->insert([
|
|
'project_id' => $projectId,
|
|
'name' => 'Bug',
|
|
'position' => 1,
|
|
'is_parent' => 0,
|
|
'created_at' => now(),
|
|
'updated_at' => now(),
|
|
]);
|
|
|
|
Artisan::call('migrate', [
|
|
'--path' => 'database/migrations/2026_06_05_161500_move_project_metadata_to_project_templates.php',
|
|
]);
|
|
|
|
$project = DB::table('projects')->where('id', $projectId)->first();
|
|
$template = DB::table('project_templates')->where('id', $project->project_template_id)->first();
|
|
$ticketType = DB::table('ticket_types')->where('project_id', $projectId)->first();
|
|
$snapshot = json_decode((string) $template->configuration_snapshot, true, 512, JSON_THROW_ON_ERROR);
|
|
|
|
$this->assertSame($project->project_template_id, $ticketType->project_template_id);
|
|
$this->assertSame(['Bug'], array_column($snapshot[DuplicateProjectConfiguration::COPY_TICKET_TYPES], 'name'));
|
|
}
|
|
}
|