/xt/locale.t

http://github.com/gshank/html-formhandler · Raku · 131 lines · 84 code · 29 blank · 18 comment · 2 complexity · c03209b68e91f549f43c2a11020f8d64 MD5 · raw file

  1. use strict;
  2. use warnings;
  3. use Test::More;
  4. use Test::Exception;
  5. use HTML::FormHandler::Field::Text;
  6. use lib ('t/lib');
  7. # ensure $ENV is properly set up
  8. my @LH_VARS = ('LANGUAGE_HANDLE', 'HTTP_ACCEPT_LANGUAGE', 'LANG', 'LANGUAGE' );
  9. my %LOC_ENV;
  10. $LOC_ENV{$_} = delete $ENV{$_} for @LH_VARS;
  11. # a primitive translation package
  12. {
  13. package HTML::FormHandler::I18N::xx_xx;
  14. use base 'HTML::FormHandler::I18N';
  15. # Auto define lexicon
  16. our %Lexicon = (
  17. '_AUTO' => 1,
  18. 'You lost, insert coin' => 'Not won, coin needed',
  19. 'Test field' => 'Grfg svryq',
  20. );
  21. }
  22. # a simple demo form
  23. {
  24. package Test::Form;
  25. use HTML::FormHandler::Moose;
  26. extends 'HTML::FormHandler';
  27. has_field 'test_field';
  28. }
  29. my $form;
  30. ################ Locale -none-
  31. $ENV{LANGUAGE} = 'en-US';
  32. # create form w/o locale must work
  33. lives_ok { $form = Test::Form->new } 'create form w/o locale lives';
  34. ok($form, 'create form w/o locale');
  35. is(ref($form->language_handle), 'HTML::FormHandler::I18N::en_us', 'locale en_us');
  36. # ensure we know / don't know the translations
  37. $HTML::FormHandler::I18N::en_us::Lexicon{'You lost, insert coin'} = 'XX Dummy 42';
  38. $HTML::FormHandler::I18N::en_us::Lexicon{'Must insert a [_1] coin'} = 'Want a [_1] coin';
  39. delete $HTML::FormHandler::I18N::en_us::Lexicon{'Test field'};
  40. delete $HTML::FormHandler::I18N::en_us::Lexicon{'You won'};
  41. # translating a known error works
  42. $form->field('test_field')->clear_errors;
  43. $form->field('test_field')->add_error('You lost, insert coin');
  44. is_deeply($form->field('test_field')->errors, ['XX Dummy 42'], 'error is translated into en_us');
  45. # translating a known label
  46. is($form->field('test_field')->label, 'Test field', 'Label w/o translation = ok');
  47. # translating a known error with a positional parameter
  48. $form->field('test_field')->clear_errors;
  49. $form->field('test_field')->add_error('Must insert a [_1] coin', 'cleaned');
  50. is_deeply($form->field('test_field')->errors, ['Want a cleaned coin'], 'error w/parameter is translated into en_us');
  51. # translating an unknown error also works
  52. $form->field('test_field')->clear_errors;
  53. $form->field('test_field')->add_error('You won');
  54. is_deeply($form->field('test_field')->errors, ['You won'], 'error is translated into en_us');
  55. # translating an error with bracket issues
  56. $form->field('test_field')->clear_errors;
  57. dies_ok( sub { $form->field('test_field')->add_error('You are not authorized for this archive. See: [<a href="/help/auth">more information</a>], [<a href="/need_auth">request authorization</a>]') }, 'dies on maketext error' );
  58. lives_ok( sub { $form->field('test_field')->add_error('An error with ~[escaped brackets~]'); },
  59. 'does not die when brackets are escaped with tilde' );
  60. ################ Locale xx_xx set via ENV{LANGUAGE_HANDLE}
  61. $ENV{LANGUAGE_HANDLE} = 'xx_xx';
  62. # create form w/ locale must work
  63. undef $form;
  64. lives_ok { $form = Test::Form->new } 'create form w/ locale lives';
  65. ok($form, 'create form w/ locale');
  66. is(ref($form->language_handle), 'HTML::FormHandler::I18N::xx_xx', 'locale xx_xx');
  67. # translating a known error works
  68. $form->field('test_field')->clear_errors;
  69. $form->field('test_field')->add_error('You lost, insert coin');
  70. is_deeply($form->field('test_field')->errors, ['Not won, coin needed'], 'error is translated into xx_xx');
  71. # translating an unknown error also works
  72. $form->field('test_field')->clear_errors;
  73. $form->field('test_field')->add_error('You won');
  74. is_deeply($form->field('test_field')->errors, ['You won'], 'error is translated into xx_xx');
  75. # translating a known label
  76. is($form->field('test_field')->loc_label, 'Grfg svryq', 'label rot13 to xx_xx');
  77. # remove from environment variable, so we can use builder
  78. delete $ENV{LANGUAGE_HANDLE};
  79. {
  80. package MyApp::Test::Form;
  81. use HTML::FormHandler::Moose;
  82. extends 'HTML::FormHandler';
  83. use MyApp::I18N::abc_de;
  84. sub _build_language_handle { MyApp::I18N::abc_de->new }
  85. has_field 'foo';
  86. has_field 'bar';
  87. sub validate_foo {
  88. my ( $self, $field ) = @_;
  89. $field->add_error('You lost, insert coin');
  90. }
  91. }
  92. $form = MyApp::Test::Form->new;
  93. ok( $form, 'form built' );
  94. $form->process( params => { foo => 'test' } );
  95. is( $form->field('foo')->errors->[0], 'Loser! coin needed', 'right message' );
  96. is( ref $form->language_handle, 'MyApp::I18N::abc_de', 'using right lh');
  97. is( ref $form->field('foo')->language_handle, 'MyApp::I18N::abc_de', 'field uses form language handle' );
  98. $form->process( language_handle => HTML::FormHandler::I18N->get_handle('en_us'), params => { foo => 'byebye' } );
  99. my $field_lh = $form->field('bar')->language_handle;
  100. is( ref $field_lh, 'HTML::FormHandler::I18N::en_us', 'field uses form language handle' );
  101. $ENV{$_} = 'en-US' for @LH_VARS;
  102. done_testing;