Add document_translations table and migrate existing data
documents.{title,content,rendered_html} move to document_translations
keyed by (document_id, locale). Existing rows are copied to a single
translation in config('app.locale'). documents gains default_locale.
Also guard the original FULLTEXT ALTER TABLE with a MySQL driver check
so that the SQLite test environment can run all migrations cleanly.
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Illuminate\Database\Migrations\Migrator;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Tests\TestCase;
|
||||
|
||||
class DocumentMigrationTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
public function test_documents_table_has_default_locale_after_migration(): void
|
||||
{
|
||||
$this->assertTrue(Schema::hasColumn('documents', 'default_locale'));
|
||||
}
|
||||
|
||||
public function test_documents_table_no_longer_has_translatable_columns(): void
|
||||
{
|
||||
$this->assertFalse(Schema::hasColumn('documents', 'title'));
|
||||
$this->assertFalse(Schema::hasColumn('documents', 'content'));
|
||||
$this->assertFalse(Schema::hasColumn('documents', 'rendered_html'));
|
||||
}
|
||||
|
||||
public function test_document_translations_table_exists_with_required_columns(): void
|
||||
{
|
||||
$this->assertTrue(Schema::hasTable('document_translations'));
|
||||
|
||||
foreach (['document_id', 'locale', 'title', 'content', 'rendered_html', 'created_by', 'updated_by', 'created_at', 'updated_at'] as $col) {
|
||||
$this->assertTrue(
|
||||
Schema::hasColumn('document_translations', $col),
|
||||
"document_translations missing column: $col"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public function test_document_translations_unique_document_locale(): void
|
||||
{
|
||||
DB::table('documents')->insert([
|
||||
'path' => 'A.md',
|
||||
'slug' => 'a',
|
||||
'default_locale' => 'en',
|
||||
'file_size' => 0,
|
||||
'file_hash' => str_repeat('0', 64),
|
||||
'file_modified_at' => now(),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
$docId = DB::table('documents')->where('slug', 'a')->value('id');
|
||||
|
||||
DB::table('document_translations')->insert([
|
||||
'document_id' => $docId,
|
||||
'locale' => 'en',
|
||||
'title' => 'A',
|
||||
'content' => '...',
|
||||
'rendered_html' => '<p>...</p>',
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
$this->expectException(\Illuminate\Database\QueryException::class);
|
||||
|
||||
DB::table('document_translations')->insert([
|
||||
'document_id' => $docId,
|
||||
'locale' => 'en',
|
||||
'title' => 'duplicate',
|
||||
'content' => '...',
|
||||
'rendered_html' => '<p>...</p>',
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user