Skip to content

Commit

Permalink
Issue #3728: refactor towards using subtests and also add some utf8 s…
Browse files Browse the repository at this point in the history
…pecial character fuzz tests
  • Loading branch information
MichaelThumes authored and svenoe committed Sep 19, 2024
1 parent ad81aa4 commit f06e077
Showing 1 changed file with 136 additions and 94 deletions.
230 changes: 136 additions & 94 deletions scripts/test/Translations.t
Original file line number Diff line number Diff line change
Expand Up @@ -44,113 +44,116 @@ sub TestAdminTranslation {

my %Params = @_;

# see if there is an existing translation
my $OldTranslation = _GetExistingAdminTranslation(
Content => $Params{Content},
LanguageId => $Params{LanguageId},
);

# set userid to translation owner, or use admin if new
my $UserId = $OldTranslation ? $OldTranslation->{CreateBy} : 1;
subtest $Params{Description} => sub {

# delete any existing Translations for this $Content key
if ($OldTranslation) {
_DeleteTranslation(
TranslationId => $OldTranslation->{Id},
UserId => $UserId,
LanguageId => $Params{LanguageId},
Content => $Params{Content},
Translation => $Params{Translation}
# see if there is an existing translation
my $OldTranslation = _GetExistingAdminTranslation(
Content => $Params{Content},
LanguageId => $Params{LanguageId},
);
}

# add a Translation Draft for the new translation key
my $Result = $TranslationsObject->DraftTranslationsAdd(
Language => $Params{LanguageId},
Content => $Params{Content},
Translation => $Params{Translation},
UserID => $UserId,
);

# is it expected to fail?
if ( !defined $Params{ExpectedResult} ) {

is(
$Result,
undef,
"Translation ($Params{LanguageId}) draft for <$Params{Content}> failed as intended."
);
# set userid to translation owner, or use admin if new
my $UserId = $OldTranslation ? $OldTranslation->{CreateBy} : 1;

# cleanup
# delete any existing Translations for this $Content key
if ($OldTranslation) {
_RestoreOldTranslation($OldTranslation);
_DeleteTranslation(
TranslationId => $OldTranslation->{Id},
UserId => $UserId,
LanguageId => $Params{LanguageId},
Content => $Params{Content},
Translation => $Params{Translation}
);
}
return;
}

# should have a valid Translation draft now
is(
$Result,
1,
"Translation ($Params{LanguageId}) draft for <$Params{Content}> added successfully."
);
# add a Translation Draft for the new translation key
my $Result = $TranslationsObject->DraftTranslationsAdd(
Language => $Params{LanguageId},
Content => $Params{Content},
Translation => $Params{Translation},
UserID => $UserId,
);

# deploy Translation draft
$Result = $TranslationsObject->WriteTranslationFile(
UserLanguage => $Params{LanguageId},
);
# is it expected to fail?
if ( !defined $Params{ExpectedResult} ) {

is(
$Result,
1,
"Translation ($Params{LanguageId}) draft for <$Params{Content}> deployed successfully."
);
is(
$Result,
undef,
"Translation ($Params{LanguageId}) draft for <$Params{Content}> failed as intended."
);

# fetch the new translation so that we can clean it up later
my $NewTranslation = _GetExistingAdminTranslation(
Content => $Params{Content},
LanguageId => $Params{LanguageId},
);
ok( $NewTranslation, "have new Translation." );
# cleanup
if ($OldTranslation) {
_RestoreOldTranslation($OldTranslation);
}
return;
}

# re-fetch Language object from OM after update
$Kernel::OM->ObjectsDiscard();
# should have a valid Translation draft now
is(
$Result,
1,
"Translation ($Params{LanguageId}) draft for <$Params{Content}> added successfully."
);

$Kernel::OM->ObjectParamAdd(
'Kernel::Language' => {
UserTimeZone => $Tz,
# deploy Translation draft
$Result = $TranslationsObject->WriteTranslationFile(
UserLanguage => $Params{LanguageId},
Action => '',
Debug => 1
},
);
my $LanguageObject = $Kernel::OM->Get('Kernel::Language');
);

isa_ok(
$LanguageObject,
['Kernel::Language'], 'got a Language object'
);
is(
$Result,
1,
"Translation ($Params{LanguageId}) draft for <$Params{Content}> deployed successfully."
);

# test for the new translation to be actually applied
my $Translated = $LanguageObject->Translate( $Params{Content} );
is(
$Translated,
$Params{Translation},
"Translation ($Params{LanguageId}) <$Params{Translation}> for <$Params{Content}> applied successfully."
);
# fetch the new translation so that we can clean it up later
my $NewTranslation = _GetExistingAdminTranslation(
Content => $Params{Content},
LanguageId => $Params{LanguageId},
);
ok( $NewTranslation, "have new Translation." );

# re-fetch Language object from OM after update
$Kernel::OM->ObjectsDiscard();

$Kernel::OM->ObjectParamAdd(
'Kernel::Language' => {
UserTimeZone => $Tz,
UserLanguage => $Params{LanguageId},
Action => '',
Debug => 1
},
);
my $LanguageObject = $Kernel::OM->Get('Kernel::Language');

# cleanup
_DeleteTranslation(
TranslationId => $NewTranslation->{Id},
UserId => $UserId,
LanguageId => $Params{LanguageId},
Content => $Params{Content},
Translation => $Params{Translation}
);
isa_ok(
$LanguageObject,
['Kernel::Language'], 'got a Language object'
);

if ($OldTranslation) {
_RestoreOldTranslation($OldTranslation);
}
# test for the new translation to be actually applied
my $Translated = $LanguageObject->Translate( $Params{Content} );
is(
$Translated,
$Params{Translation},
"Translation ($Params{LanguageId}) <$Params{Translation}> for <$Params{Content}> applied successfully."
);

# cleanup
_DeleteTranslation(
TranslationId => $NewTranslation->{Id},
UserId => $UserId,
LanguageId => $Params{LanguageId},
Content => $Params{Content},
Translation => $Params{Translation}
);

if ($OldTranslation) {
_RestoreOldTranslation($OldTranslation);
}
};

return;
}
Expand All @@ -159,59 +162,98 @@ sub TestAdminTranslation {

my @AdminTranslationTestCases = (
{
Description => 'Translation without leading or trailing whitespace still works.',
LanguageId => 'en',
Content => 'Tickets',
Translation => 'TheWonderfulTranslationForTicket',
ExpectedResult => 1
},
{
Description => 'Leading whitespace in translation value is preserved.',
LanguageId => 'de',
Content => 'Tickets',
Translation => ' Tickets++',
ExpectedResult => 1
},
{
Description => 'Trailing whitespace in translation value is preserved.',
LanguageId => 'de',
Content => 'Tickets',
Translation => 'Tickets++ ',
ExpectedResult => 1
},
{
Description => 'Surrounding whitespace in translation value is preserved.',
LanguageId => 'de',
Content => 'Tickets',
Translation => ' Tickets++ ',
ExpectedResult => 1
},
{
Description => 'Leading whitespace in translation content key is preserved.',
LanguageId => 'en',
Content => ' Tickets',
Translation => 'TheWonderfulTranslationForTicket',
ExpectedResult => 1
},
{
Description => 'Trailing whitespace in translation content key is preserved.',
LanguageId => 'en',
Content => ' Tickets ',
Content => 'Tickets ',
Translation => 'TheWonderfulTranslationForTicket',
ExpectedResult => 1
},
{
Description => 'Surrounding whitespace in translation content key is preserved',
LanguageId => 'en',
Content => ' Tickets ',
Translation => 'TheWonderfulTranslationForTicket',
ExpectedResult => 1
},

# invalid tests
{
Description => 'Empty translation content key is not supported.',
LanguageId => 'en',
Content => '', # invalid
Content => '', # invalid
Translation => 'TheWonderfulTranslationForTicket',
ExpectedResult => undef
},
{
Description => 'Empty translation value is not supported',
LanguageId => 'en',
Content => 'Tickets',
Translation => '', # invalid
Translation => '', # invalid
ExpectedResult => undef
}
},

# a bit of umlaut and special char fuzzing
{
Description => 'German Umlauts, no surrounding whitespace in translation value.',
LanguageId => 'de',
Content => 'Tickets',
Translation => ' Falsches Üben von Xylophonmusik quält jeden größeren Zwerg',
ExpectedResult => 1
},
{
Description => 'Francophonia with trailing whitespace in translation value.',
LanguageId => 'fr',
Content => 'Tickets',
Translation => 'Voix ambiguë d\'un cœur qui, au zéphyr, préfère les jattes de kiwis ',
ExpectedResult => 1

# French for: Ambiguous voice of a heart that prefers bowls of kiwis to the zephyr
},
{
Description => 'Russian with surrounding whitespace is supported.',
LanguageId => 'ru',
Content => 'Tickets',
Translation => ' Съешь ещё этих мягких французских булок, да выпей чаю ',
ExpectedResult => 1

# Russian for: Eat some more of these soft French rolls and drink some tea
},

);

for my $TestCase (@AdminTranslationTestCases) {
Expand Down

0 comments on commit f06e077

Please sign in to comment.