kriss-gettext_i18n 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +78 -0
  4. data/VERSION.yml +4 -0
  5. data/gettext_i18n.gemspec +86 -0
  6. data/init.rb +1 -0
  7. data/lib/gettext_i18n.rb +25 -0
  8. data/lib/globalize/backend/gettext.rb +26 -0
  9. data/lib/globalize/i18n.rb +46 -0
  10. data/lib/rails/extend.rb +7 -0
  11. data/lib/ruby/string.rb +15 -0
  12. data/lib/ruby/symbol.rb +15 -0
  13. data/test/gettext_i18n_test.rb +114 -0
  14. data/test/locales/en.yml +2 -0
  15. data/test/locales/pl.yml +6 -0
  16. data/test/locales/root.yml +2 -0
  17. data/test/test_helper.rb +13 -0
  18. data/vendor/globalize2/LICENSE +21 -0
  19. data/vendor/globalize2/README.textile +202 -0
  20. data/vendor/globalize2/Rakefile +22 -0
  21. data/vendor/globalize2/generators/db_backend.rb +0 -0
  22. data/vendor/globalize2/generators/templates/db_backend_migration.rb +25 -0
  23. data/vendor/globalize2/init.rb +10 -0
  24. data/vendor/globalize2/lib/globalize/backend/chain.rb +102 -0
  25. data/vendor/globalize2/lib/globalize/backend/pluralizing.rb +37 -0
  26. data/vendor/globalize2/lib/globalize/backend/static.rb +59 -0
  27. data/vendor/globalize2/lib/globalize/i18n/missing_translations_log_handler.rb +41 -0
  28. data/vendor/globalize2/lib/globalize/i18n/missing_translations_raise_handler.rb +27 -0
  29. data/vendor/globalize2/lib/globalize/load_path.rb +63 -0
  30. data/vendor/globalize2/lib/globalize/locale/fallbacks.rb +63 -0
  31. data/vendor/globalize2/lib/globalize/locale/language_tag.rb +81 -0
  32. data/vendor/globalize2/lib/globalize/model/active_record/adapter.rb +96 -0
  33. data/vendor/globalize2/lib/globalize/model/active_record/translated.rb +161 -0
  34. data/vendor/globalize2/lib/globalize/model/active_record.rb +38 -0
  35. data/vendor/globalize2/lib/globalize/translation.rb +32 -0
  36. data/vendor/globalize2/lib/locale/root.yml +3 -0
  37. data/vendor/globalize2/lib/rails_edge_load_path_patch.rb +40 -0
  38. data/vendor/globalize2/notes.textile +51 -0
  39. data/vendor/globalize2/test/backends/chained_test.rb +175 -0
  40. data/vendor/globalize2/test/backends/pluralizing_test.rb +63 -0
  41. data/vendor/globalize2/test/backends/static_test.rb +143 -0
  42. data/vendor/globalize2/test/data/locale/all.yml +2 -0
  43. data/vendor/globalize2/test/data/locale/de-DE.yml +2 -0
  44. data/vendor/globalize2/test/data/locale/en-US/module.yml +2 -0
  45. data/vendor/globalize2/test/data/locale/en-US.yml +2 -0
  46. data/vendor/globalize2/test/data/locale/fi-FI/module.yml +2 -0
  47. data/vendor/globalize2/test/data/locale/root.yml +0 -0
  48. data/vendor/globalize2/test/data/no_globalize_schema.rb +11 -0
  49. data/vendor/globalize2/test/data/post.rb +24 -0
  50. data/vendor/globalize2/test/data/schema.rb +39 -0
  51. data/vendor/globalize2/test/i18n/missing_translations_test.rb +36 -0
  52. data/vendor/globalize2/test/load_path_test.rb +49 -0
  53. data/vendor/globalize2/test/locale/fallbacks_test.rb +154 -0
  54. data/vendor/globalize2/test/locale/language_tag_test.rb +130 -0
  55. data/vendor/globalize2/test/model/active_record/migration_test.rb +78 -0
  56. data/vendor/globalize2/test/model/active_record/sti_translated_test.rb +75 -0
  57. data/vendor/globalize2/test/model/active_record/translated_test.rb +458 -0
  58. data/vendor/globalize2/test/test_helper.rb +36 -0
  59. data/vendor/globalize2/test/translation_test.rb +54 -0
  60. metadata +121 -0
@@ -0,0 +1,78 @@
1
+ require File.join( File.dirname(__FILE__), '..', '..', 'test_helper' )
2
+ require 'active_record'
3
+ require 'globalize/model/active_record'
4
+
5
+ # Hook up model translation
6
+ ActiveRecord::Base.send(:include, Globalize::Model::ActiveRecord::Translated)
7
+
8
+ # Load Post model
9
+ require File.join( File.dirname(__FILE__), '..', '..', 'data', 'post' )
10
+
11
+ class MigrationTest < ActiveSupport::TestCase
12
+ def setup
13
+ reset_db! File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'no_globalize_schema.rb'))
14
+ end
15
+
16
+ test 'globalize table added' do
17
+ assert !Post.connection.table_exists?( :post_translations )
18
+ assert !Post.connection.index_exists?( :post_translations, :post_id )
19
+ Post.create_translation_table! :subject => :string, :content => :text
20
+ assert Post.connection.table_exists?( :post_translations )
21
+ assert Post.connection.index_exists?( :post_translations, :post_id )
22
+ columns = Post.connection.columns( :post_translations )
23
+ assert locale = columns.detect {|c| c.name == 'locale' }
24
+ assert_equal :string, locale.type
25
+ assert subject = columns.detect {|c| c.name == 'subject' }
26
+ assert_equal :string, subject.type
27
+ assert content = columns.detect {|c| c.name == 'content' }
28
+ assert_equal :text, content.type
29
+ assert post_id = columns.detect {|c| c.name == 'post_id' }
30
+ assert_equal :integer, post_id.type
31
+ assert created_at = columns.detect {|c| c.name == 'created_at' }
32
+ assert_equal :datetime, created_at.type
33
+ assert updated_at = columns.detect {|c| c.name == 'updated_at' }
34
+ assert_equal :datetime, updated_at.type
35
+ end
36
+
37
+ test 'globalize table dropped' do
38
+ assert !Post.connection.table_exists?( :post_translations )
39
+ assert !Post.connection.index_exists?( :post_translations, :post_id )
40
+ Post.create_translation_table! :subject => :string, :content => :text
41
+ assert Post.connection.table_exists?( :post_translations )
42
+ assert Post.connection.index_exists?( :post_translations, :post_id )
43
+ Post.drop_translation_table!
44
+ assert !Post.connection.table_exists?( :post_translations )
45
+ assert !Post.connection.index_exists?( :post_translations, :post_id )
46
+ end
47
+
48
+ test 'exception on untranslated field inputs' do
49
+ assert_raise Globalize::Model::UntranslatedMigrationField do
50
+ Post.create_translation_table! :subject => :string, :content => :text, :bogus => :string
51
+ end
52
+ end
53
+
54
+ test 'exception on missing field inputs' do
55
+ assert_raise Globalize::Model::MigrationMissingTranslatedField do
56
+ Post.create_translation_table! :content => :text
57
+ end
58
+ end
59
+
60
+ test 'exception on bad input type' do
61
+ assert_raise Globalize::Model::BadMigrationFieldType do
62
+ Post.create_translation_table! :subject => :string, :content => :integer
63
+ end
64
+ end
65
+
66
+ test 'create_translation_table! should not be called on non-translated models' do
67
+ assert_raise NoMethodError do
68
+ Blog.create_translation_table! :name => :string
69
+ end
70
+ end
71
+
72
+ test 'drop_translation_table! should not be called on non-translated models' do
73
+ assert_raise NoMethodError do
74
+ Blog.drop_translation_table!
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,75 @@
1
+ require File.join( File.dirname(__FILE__), '..', '..', 'test_helper' )
2
+ require 'active_record'
3
+ require 'globalize/model/active_record'
4
+
5
+ # Hook up model translation
6
+ ActiveRecord::Base.send(:include, Globalize::Model::ActiveRecord::Translated)
7
+
8
+ # Load Post model
9
+ require File.join( File.dirname(__FILE__), '..', '..', 'data', 'post' )
10
+
11
+ class StiTranslatedTest < ActiveSupport::TestCase
12
+ def setup
13
+ I18n.locale = :'en-US'
14
+ I18n.fallbacks.clear
15
+ reset_db! File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'schema.rb'))
16
+ end
17
+
18
+ def teardown
19
+ I18n.fallbacks.clear
20
+ end
21
+
22
+ test "works with simple dynamic finders" do
23
+ foo = Child.create :content => 'foo'
24
+ Child.create :content => 'bar'
25
+ child = Child.find_by_content('foo')
26
+ assert_equal foo, child
27
+ end
28
+
29
+ test 'change attribute on globalized model' do
30
+ child = Child.create :content => 'foo'
31
+ assert_equal [], child.changed
32
+ child.content = 'bar'
33
+ assert_equal [ 'content' ], child.changed
34
+ child.content = 'baz'
35
+ assert_member 'content', child.changed
36
+ end
37
+
38
+ test 'change attribute on globalized model after locale switching' do
39
+ child = Child.create :content => 'foo'
40
+ assert_equal [], child.changed
41
+ child.content = 'bar'
42
+ I18n.locale = :de
43
+ assert_equal [ 'content' ], child.changed
44
+ end
45
+
46
+ test 'fallbacks with lots of locale switching' do
47
+ I18n.fallbacks.map :'de-DE' => [ :'en-US' ]
48
+ child = Child.create :content => 'foo'
49
+
50
+ I18n.locale = :'de-DE'
51
+ assert_equal 'foo', child.content
52
+
53
+ I18n.locale = :'en-US'
54
+ child.update_attribute :content, 'bar'
55
+
56
+ I18n.locale = :'de-DE'
57
+ assert_equal 'bar', child.content
58
+ end
59
+
60
+ test "saves all locales, even after locale switching" do
61
+ child = Child.new :content => 'foo'
62
+ I18n.locale = 'de-DE'
63
+ child.content = 'bar'
64
+ I18n.locale = 'he-IL'
65
+ child.content = 'baz'
66
+ child.save
67
+ I18n.locale = 'en-US'
68
+ child = Child.first
69
+ assert_equal 'foo', child.content
70
+ I18n.locale = 'de-DE'
71
+ assert_equal 'bar', child.content
72
+ I18n.locale = 'he-IL'
73
+ assert_equal 'baz', child.content
74
+ end
75
+ end
@@ -0,0 +1,458 @@
1
+ require File.join( File.dirname(__FILE__), '..', '..', 'test_helper' )
2
+ require 'active_record'
3
+ require 'globalize/model/active_record'
4
+
5
+ # Hook up model translation
6
+ ActiveRecord::Base.send(:include, Globalize::Model::ActiveRecord::Translated)
7
+
8
+ # Load Post model
9
+ require File.join( File.dirname(__FILE__), '..', '..', 'data', 'post' )
10
+
11
+ class TranslatedTest < ActiveSupport::TestCase
12
+ def setup
13
+ I18n.locale = :'en-US'
14
+ I18n.fallbacks.clear
15
+ reset_db! File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'schema.rb'))
16
+ ActiveRecord::Base.locale = nil
17
+ end
18
+
19
+ def teardown
20
+ I18n.fallbacks.clear
21
+ end
22
+
23
+ test "modifiying translated fields" do
24
+ post = Post.create :subject => 'foo'
25
+ assert_equal 'foo', post.subject
26
+ post.subject = 'bar'
27
+ assert_equal 'bar', post.subject
28
+ end
29
+
30
+ test "modifiying translated fields while switching locales" do
31
+ post = Post.create :subject => 'foo'
32
+ assert_equal 'foo', post.subject
33
+ I18n.locale = :'de-DE'
34
+ post.subject = 'bar'
35
+ assert_equal 'bar', post.subject
36
+ I18n.locale = :'en-US'
37
+ assert_equal 'foo', post.subject
38
+ I18n.locale = :'de-DE'
39
+ post.subject = 'bar'
40
+ end
41
+
42
+ test "has post_translations" do
43
+ post = Post.create
44
+ assert_nothing_raised { post.globalize_translations }
45
+ end
46
+
47
+ test "has German post_translations" do
48
+ I18n.locale = :de
49
+ post = Post.create :subject => 'foo'
50
+ assert_equal 1, post.globalize_translations.size
51
+ I18n.locale = :en
52
+ assert_equal 1, post.globalize_translations.size
53
+ end
54
+
55
+ test "returns the value passed to :subject" do
56
+ post = Post.new
57
+ assert_equal 'foo', (post.subject = 'foo')
58
+ end
59
+
60
+ test "translates subject and content into en-US" do
61
+ post = Post.create :subject => 'foo', :content => 'bar'
62
+ assert_equal 'foo', post.subject
63
+ assert_equal 'bar', post.content
64
+ assert post.save
65
+ post.reload
66
+ assert_equal 'foo', post.subject
67
+ assert_equal 'bar', post.content
68
+ end
69
+
70
+ test "finds a German post" do
71
+ post = Post.create :subject => 'foo (en)', :content => 'bar'
72
+ I18n.locale = 'de-DE'
73
+ post = Post.first
74
+ post.subject = 'baz (de)'
75
+ post.save
76
+ assert_equal 'baz (de)', Post.first.subject
77
+ I18n.locale = :'en-US'
78
+ assert_equal 'foo (en)', Post.first.subject
79
+ end
80
+
81
+ test "saves an English post and loads test correctly" do
82
+ assert_nil Post.first
83
+ post = Post.create :subject => 'foo', :content => 'bar'
84
+ assert post.save
85
+ post = Post.first
86
+ assert_equal 'foo', post.subject
87
+ assert_equal 'bar', post.content
88
+ end
89
+
90
+ test "updates an attribute" do
91
+ post = Post.create :subject => 'foo', :content => 'bar'
92
+ post.update_attribute :subject, 'baz'
93
+ assert_equal 'baz', Post.first.subject
94
+ end
95
+
96
+ test "update_attributes failure" do
97
+ post = Post.create :subject => 'foo', :content => 'bar'
98
+ assert !post.update_attributes( { :subject => '' } )
99
+ assert_nil post.reload.attributes['subject']
100
+ assert_equal 'foo', post.subject
101
+ end
102
+
103
+ test "validates presence of :subject" do
104
+ post = Post.new
105
+ assert !post.save
106
+
107
+ post = Post.new :subject => 'foo'
108
+ assert post.save
109
+ end
110
+
111
+ test "returns the value for the correct locale, after locale switching" do
112
+ post = Post.create :subject => 'foo'
113
+ I18n.locale = 'de-DE'
114
+ post.subject = 'bar'
115
+ post.save
116
+ I18n.locale = 'en-US'
117
+ post = Post.first
118
+ assert_equal 'foo', post.subject
119
+ I18n.locale = 'de-DE'
120
+ assert_equal 'bar', post.subject
121
+ end
122
+
123
+ test "keeping one field in new locale when other field is changed" do
124
+ I18n.fallbacks.map 'de-DE' => [ 'en-US' ]
125
+ post = Post.create :subject => 'foo'
126
+ I18n.locale = 'de-DE'
127
+ post.content = 'bar'
128
+ assert_equal 'foo', post.subject
129
+ end
130
+
131
+ test "modifying non-required field in a new locale" do
132
+ I18n.fallbacks.map 'de-DE' => [ 'en-US' ]
133
+ post = Post.create :subject => 'foo'
134
+ I18n.locale = 'de-DE'
135
+ post.content = 'bar'
136
+ assert post.save
137
+ end
138
+
139
+ test "returns the value for the correct locale, after locale switching, without saving" do
140
+ post = Post.create :subject => 'foo'
141
+ I18n.locale = 'de-DE'
142
+ post.subject = 'bar'
143
+ I18n.locale = 'en-US'
144
+ assert_equal 'foo', post.subject
145
+ I18n.locale = 'de-DE'
146
+ assert_equal 'bar', post.subject
147
+ end
148
+
149
+ test "saves all locales, even after locale switching" do
150
+ post = Post.new :subject => 'foo'
151
+ I18n.locale = 'de-DE'
152
+ post.subject = 'bar'
153
+ I18n.locale = 'he-IL'
154
+ post.subject = 'baz'
155
+ post.save
156
+ I18n.locale = 'en-US'
157
+ post = Post.first
158
+ assert_equal 'foo', post.subject
159
+ I18n.locale = 'de-DE'
160
+ assert_equal 'bar', post.subject
161
+ I18n.locale = 'he-IL'
162
+ assert_equal 'baz', post.subject
163
+ end
164
+
165
+ test "resolves a simple fallback" do
166
+ I18n.locale = 'de-DE'
167
+ post = Post.create :subject => 'foo'
168
+ I18n.locale = 'de'
169
+ post.subject = 'baz'
170
+ post.content = 'bar'
171
+ post.save
172
+ I18n.locale = 'de-DE'
173
+ assert_equal 'foo', post.subject
174
+ assert_equal 'bar', post.content
175
+ end
176
+
177
+ test "resolves a simple fallback without reloading" do
178
+ I18n.locale = 'de-DE'
179
+ post = Post.new :subject => 'foo'
180
+ I18n.locale = 'de'
181
+ post.subject = 'baz'
182
+ post.content = 'bar'
183
+ I18n.locale = 'de-DE'
184
+ assert_equal 'foo', post.subject
185
+ assert_equal 'bar', post.content
186
+ end
187
+
188
+ test "resolves a complex fallback without reloading" do
189
+ I18n.fallbacks.map 'de' => %w(en he)
190
+ I18n.locale = 'de'
191
+ post = Post.new
192
+ I18n.locale = 'en'
193
+ post.subject = 'foo'
194
+ I18n.locale = 'he'
195
+ post.subject = 'baz'
196
+ post.content = 'bar'
197
+ I18n.locale = 'de'
198
+ assert_equal 'foo', post.subject
199
+ assert_equal 'bar', post.content
200
+ end
201
+
202
+ test "returns nil if no translations are found" do
203
+ post = Post.new :subject => 'foo'
204
+ assert_equal 'foo', post.subject
205
+ assert_nil post.content
206
+ end
207
+
208
+ test "returns nil if no translations are found; reloaded" do
209
+ post = Post.create :subject => 'foo'
210
+ post = Post.first
211
+ assert_equal 'foo', post.subject
212
+ assert_nil post.content
213
+ end
214
+
215
+ test "works with associations" do
216
+ blog = Blog.create
217
+ post1 = blog.posts.create :subject => 'foo'
218
+ I18n.locale = 'de-DE'
219
+ post2 = blog.posts.create :subject => 'bar'
220
+ assert_equal 2, blog.posts.size
221
+ I18n.locale = 'en-US'
222
+ assert_equal 'foo', blog.posts.first.subject
223
+ assert_nil blog.posts.last.subject
224
+ I18n.locale = 'de-DE'
225
+ assert_equal 'bar', blog.posts.last.subject
226
+ end
227
+
228
+ test "works with simple dynamic finders" do
229
+ foo = Post.create :subject => 'foo'
230
+ Post.create :subject => 'bar'
231
+ post = Post.find_by_subject('foo')
232
+ assert_equal foo, post
233
+ end
234
+
235
+ test 'change attribute on globalized model' do
236
+ post = Post.create :subject => 'foo', :content => 'bar'
237
+ assert_equal [], post.changed
238
+ post.subject = 'baz'
239
+ assert_equal [ 'subject' ], post.changed
240
+ post.content = 'quux'
241
+ assert_member 'subject', post.changed
242
+ assert_member 'content', post.changed
243
+ end
244
+
245
+ test 'change attribute on globalized model after locale switching' do
246
+ post = Post.create :subject => 'foo', :content => 'bar'
247
+ assert_equal [], post.changed
248
+ post.subject = 'baz'
249
+ I18n.locale = :de
250
+ assert_equal [ 'subject' ], post.changed
251
+ end
252
+
253
+ test 'fallbacks with lots of locale switching' do
254
+ I18n.fallbacks.map :'de-DE' => [ :'en-US' ]
255
+ post = Post.create :subject => 'foo'
256
+
257
+ I18n.locale = :'de-DE'
258
+ assert_equal 'foo', post.subject
259
+
260
+ I18n.locale = :'en-US'
261
+ post.update_attribute :subject, 'bar'
262
+
263
+ I18n.locale = :'de-DE'
264
+ assert_equal 'bar', post.subject
265
+ end
266
+
267
+ test 'reload' do
268
+ post = Post.create :subject => 'foo', :content => 'bar'
269
+ post.subject = 'baz'
270
+ assert_equal 'foo', post.reload.subject
271
+ end
272
+
273
+ test 'complex writing and stashing' do
274
+ post = Post.create :subject => 'foo', :content => 'bar'
275
+ post.subject = nil
276
+ assert_nil post.subject
277
+ assert !post.valid?
278
+ end
279
+
280
+ test 'translated class locale setting' do
281
+ assert ActiveRecord::Base.respond_to?(:locale)
282
+ assert_equal :'en-US', I18n.locale
283
+ assert_equal :'en-US', ActiveRecord::Base.locale
284
+ I18n.locale = :de
285
+ assert_equal :de, I18n.locale
286
+ assert_equal :de, ActiveRecord::Base.locale
287
+ ActiveRecord::Base.locale = :es
288
+ assert_equal :de, I18n.locale
289
+ assert_equal :es, ActiveRecord::Base.locale
290
+ I18n.locale = :fr
291
+ assert_equal :fr, I18n.locale
292
+ assert_equal :es, ActiveRecord::Base.locale
293
+ end
294
+
295
+ test "untranslated class responds to locale" do
296
+ assert Blog.respond_to?(:locale)
297
+ end
298
+
299
+ test "to ensure locales in different classes are the same" do
300
+ ActiveRecord::Base.locale = :de
301
+ assert_equal :de, ActiveRecord::Base.locale
302
+ assert_equal :de, Parent.locale
303
+ Parent.locale = :es
304
+ assert_equal :es, ActiveRecord::Base.locale
305
+ assert_equal :es, Parent.locale
306
+ end
307
+
308
+ test "attribute saving goes by content locale and not global locale" do
309
+ ActiveRecord::Base.locale = :de
310
+ assert_equal :'en-US', I18n.locale
311
+ Post.create :subject => 'foo'
312
+ assert_equal :de, Post.first.globalize_translations.first.locale
313
+ end
314
+
315
+ test "attribute loading goes by content locale and not global locale" do
316
+ post = Post.create :subject => 'foo'
317
+ assert_equal :'en-US', ActiveRecord::Base.locale
318
+ ActiveRecord::Base.locale = :de
319
+ assert_equal :'en-US', I18n.locale
320
+ post.update_attribute :subject, 'foo [de]'
321
+ assert_equal 'foo [de]', Post.first.subject
322
+ ActiveRecord::Base.locale = :'en-US'
323
+ assert_equal 'foo', Post.first.subject
324
+ end
325
+
326
+ test "access content locale before setting" do
327
+ Globalize::Model::ActiveRecord::Translated::ActMethods.class_eval "remove_class_variable(:@@locale)"
328
+ assert_nothing_raised { ActiveRecord::Base.locale }
329
+ end
330
+
331
+ test "translated_locales" do
332
+ Post.locale = :de
333
+ post = Post.create :subject => 'foo'
334
+ Post.locale = :es
335
+ post.update_attribute :subject, 'bar'
336
+ Post.locale = :fr
337
+ post.update_attribute :subject, 'baz'
338
+ assert_equal [ :de, :es, :fr ], post.translated_locales
339
+ assert_equal [ :de, :es, :fr ], Post.first.translated_locales
340
+ end
341
+
342
+ test "including globalize_translations" do
343
+ I18n.locale = :de
344
+ Post.create :subject => "Foo1", :content => "Bar1"
345
+ Post.create :subject => "Foo2", :content => "Bar2"
346
+
347
+ class << Post
348
+ def tranlsations_included
349
+ self.all(:include => :globalize_translations)
350
+ end
351
+ end
352
+
353
+ default = Post.all.map {|x| [x.subject, x.content]}
354
+ with_include = Post.tranlsations_included.map {|x| [x.subject, x.content]}
355
+ assert_equal default, with_include
356
+ end
357
+
358
+ test "setting multiple translations at once with options hash" do
359
+ Post.locale = :de
360
+ post = Post.create :subject => "foo1", :content => "foo1"
361
+ Post.locale = :en
362
+ post.update_attributes( :subject => "bar1", :content => "bar1" )
363
+
364
+ options = { :de => {:subject => "foo2", :content => "foo2"},
365
+ :en => {:subject => "bar2", :content => "bar2"} }
366
+ post.set_translations options
367
+ post.reload
368
+
369
+ assert ["bar2", "bar2"], [post.subject, post.content]
370
+ Post.locale = :de
371
+ assert ["foo2", "foo2"], [post.subject, post.content]
372
+ end
373
+
374
+ test "setting only one translation with set_translations" do
375
+ Post.locale = :de
376
+ post = Post.create :subject => "foo1", :content => "foo1"
377
+ Post.locale = :en
378
+ post.update_attributes( :subject => "bar1", :content => "bar1" )
379
+
380
+ options = { :en => {:subject => "bar2", :content => "bar2"} }
381
+ post.set_translations options
382
+ post.reload
383
+
384
+ assert ["bar2", "bar2"], [post.subject, post.content]
385
+ Post.locale = :de
386
+ assert ["foo1", "foo1"], [post.subject, post.content]
387
+ end
388
+
389
+ test "setting only selected attributes with set_translations" do
390
+ Post.locale = :de
391
+ post = Post.create :subject => "foo1", :content => "foo1"
392
+ Post.locale = :en
393
+ post.update_attributes( :subject => "bar1", :content => "bar1" )
394
+
395
+ options = { :de => {:content => "foo2"}, :en => {:subject => "bar2"} }
396
+ post.set_translations options
397
+ post.reload
398
+
399
+ assert ["bar2", "bar1"], [post.subject, post.content]
400
+ Post.locale = :de
401
+ assert ["foo1", "foo2"], [post.subject, post.content]
402
+ end
403
+
404
+ test "setting invalid attributes raises ArgumentError" do
405
+ Post.locale = :de
406
+ post = Post.create :subject => "foo1", :content => "foo1"
407
+ Post.locale = :en
408
+ post.update_attributes( :subject => "bar1", :content => "bar1" )
409
+
410
+ options = { :de => {:fake => "foo2"} }
411
+ exception = assert_raise(ActiveRecord::UnknownAttributeError) do
412
+ post.set_translations options
413
+ end
414
+ assert_equal "unknown attribute: fake", exception.message
415
+ end
416
+
417
+ test "reload accepting find options" do
418
+ p = Post.create :subject => "Foo", :content => "Bar"
419
+ assert p.reload(:readonly => true, :lock => true)
420
+ assert_raise(ArgumentError) { p.reload(:foo => :bar) }
421
+ end
422
+
423
+ test "dependent destroy of translation" do
424
+ p = Post.create :subject => "Foo", :content => "Bar"
425
+ assert_equal 1, PostTranslation.count
426
+ p.destroy
427
+ assert_equal 0, PostTranslation.count
428
+ end
429
+
430
+ test "translating subclass of untranslated comment model" do
431
+ translated_comment = TranslatedComment.create(:post => @post)
432
+ assert_nothing_raised { translated_comment.globalize_translations }
433
+ end
434
+
435
+ test "modifiying translated comments works as expected" do
436
+ I18n.locale = :en
437
+ translated_comment = TranslatedComment.create(:post => @post, :content => 'foo')
438
+ assert_equal 'foo', translated_comment.content
439
+
440
+ I18n.locale = :de
441
+ translated_comment.content = 'bar'
442
+ assert translated_comment.save
443
+ assert_equal 'bar', translated_comment.content
444
+
445
+ I18n.locale = :en
446
+ assert_equal 'foo', translated_comment.content
447
+
448
+ assert_equal 2, translated_comment.globalize_translations.size
449
+ end
450
+ end
451
+
452
+ # TODO should validate_presence_of take fallbacks into account? maybe we need
453
+ # an extra validation call, or more options for validate_presence_of.
454
+ # TODO error checking for fields that exist in main table, don't exist in
455
+ # proxy table, aren't strings or text
456
+ #
457
+ # TODO allow finding by translated attributes in conditions?
458
+ # TODO generate advanced dynamic finders?
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'active_support'
4
+ require 'active_support/test_case'
5
+ require 'mocha'
6
+
7
+ $LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' )
8
+
9
+ class ActiveSupport::TestCase
10
+ def reset_db!( schema_path )
11
+ ::ActiveRecord::Migration.verbose = false # Quiet down the migration engine
12
+ ::ActiveRecord::Base.establish_connection({
13
+ :adapter => 'sqlite3',
14
+ :dbfile => ':memory:'
15
+ })
16
+ ::ActiveRecord::Base.silence do
17
+ load schema_path
18
+ end
19
+ end
20
+
21
+ def assert_member(item, arr)
22
+ assert_block "Item #{item} is not in array #{arr}" do
23
+ arr.member? item
24
+ end
25
+ end
26
+ end
27
+
28
+ module ActiveRecord
29
+ module ConnectionAdapters
30
+ class AbstractAdapter
31
+ def index_exists?(table_name, column_name)
32
+ indexes(table_name).any? { |index| index.name == index_name(table_name, column_name) }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,54 @@
1
+ require File.join( File.dirname(__FILE__), 'test_helper' )
2
+ require 'globalize/translation'
3
+
4
+ class TranslationTest < ActiveSupport::TestCase
5
+ include Globalize
6
+
7
+ def setup
8
+ @translation = Translation::Static.new 'foo', :locale => :'en-US'
9
+ end
10
+
11
+ test "responds to fallback?" do
12
+ assert @translation.respond_to?( :fallback? )
13
+ end
14
+
15
+ test "returns true when :locale and :requested_locale are not equal" do
16
+ @translation.requested_locale = :'de-DE'
17
+ assert @translation.fallback?
18
+ end
19
+
20
+ test "returns false when :locale and :requested_locale are equal" do
21
+ @translation.requested_locale = :'en-US'
22
+ assert !@translation.fallback?
23
+ end
24
+
25
+ test "has the attribute :locale" do
26
+ assert @translation.respond_to?( :locale )
27
+ end
28
+
29
+ test "has the attribute :requested_locale" do
30
+ assert @translation.respond_to?( :requested_locale )
31
+ end
32
+
33
+ test "has the attribute :options" do
34
+ assert @translation.respond_to?( :options )
35
+ end
36
+
37
+ test "has the attribute :plural_key" do
38
+ assert @translation.respond_to?( :plural_key )
39
+ end
40
+
41
+ test "has the attribute :original" do
42
+ assert @translation.respond_to?( :original )
43
+ end
44
+
45
+ test "Translation::Attribute has the attribute :locale" do
46
+ translation = Translation::Attribute.new 'foo'
47
+ assert translation.respond_to?( :locale )
48
+ end
49
+
50
+ test "Translation::Attribute has the attribute :requested_locale" do
51
+ translation = Translation::Attribute.new 'foo'
52
+ assert translation.respond_to?( :requested_locale )
53
+ end
54
+ end