Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add the latest version of a translation automatically #6791

Merged
merged 1 commit into from
Nov 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/Content/Version.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,20 @@ public function create(
Language|string $language = 'default'
): void {
$language = Language::ensure($language);
$latest = $this->model->version(VersionId::latest());

// if the latest version of the translation does not exist yet,
// we have to copy over the content from the default language first.
if (
$this->isLatest() === false &&
$language->isDefault() === false &&
$latest->exists($language) === false
) {
$latest->create(
fields: $latest->read(Language::ensure('default')),
language: $language
);
}

// check if creating is allowed
VersionRules::create($this, $fields, $language);
Expand Down
38 changes: 38 additions & 0 deletions tests/Content/VersionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,44 @@ public function testCreateMultiLanguage(): void
$this->assertContentFileExists('de');
}

/**
* @covers ::create
*/
public function testCreateMultiLanguageWhenLatestTranslationIsMissing(): void
{
$this->setUpMultiLanguage();

$latest = new Version(
model: $this->model,
id: VersionId::latest()
);

$changes = new Version(
model: $this->model,
id: VersionId::changes()
);

$this->assertContentFileDoesNotExist('en', $latest->id());
$this->assertContentFileDoesNotExist('en', $changes->id());
$this->assertContentFileDoesNotExist('de', $latest->id());
$this->assertContentFileDoesNotExist('de', $changes->id());

// create the latest version for the default translation
$latest->save([
'title' => 'Test'
], $this->app->language('en'));

// create a changes version in the other language
$changes->save([
'title' => 'Translated Test',
], $this->app->language('de'));

$this->assertContentFileExists('en', $latest->id());
$this->assertContentFileDoesNotExist('en', $changes->id());
$this->assertContentFileExists('de', $latest->id());
$this->assertContentFileExists('de', $changes->id());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment: I don't want to block this PR because of it, but we should really try to get away from unit tests checking for the content file going forward as those are exactly the ones really biting us when we try to implement ImmutableMemoryStorage etc.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's the opposite of what @lukasbestle suggested. His thoughts were that we try to keep the dependencies in tests as low-level as possible. Checking for changes in the file system directly will make sure that we don't use version code or storage code in tests to prepare or check version and storage code.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can just tell you that so many unit tests issues were because of this when I tried to make the LabPage branch work. Because in many cases the storage type could change and then pinning unit tests to checking for a content file that is only used by one storage type blows up the setup.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I get it. I feel a bit lost here to be honest. I don't know a good way forward. Maybe some form of abstraction?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need to solve this here. Only midterm. But I would've thought that storage is exactly that abstraction.

}

/**
* @covers ::create
*/
Expand Down
Loading