mongoid_globalize 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,86 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{mongoid_globalize}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = [%q{Mik-die}]
12
+ s.date = %q{2011-07-25}
13
+ s.description = %q{Library for translating Mongoid documents, based on Globalize3 principles}
14
+ s.email = %q{MikDiet@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ ".rspec",
20
+ ".rvmrc",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "MIT-LICENSE",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "lib/mongoid_globalize.rb",
28
+ "lib/mongoid_globalize/act_macro.rb",
29
+ "lib/mongoid_globalize/adapter.rb",
30
+ "lib/mongoid_globalize/attributes.rb",
31
+ "lib/mongoid_globalize/class_methods.rb",
32
+ "lib/mongoid_globalize/document_translation.rb",
33
+ "lib/mongoid_globalize/instance_methods.rb",
34
+ "mongoid_globalize.gemspec",
35
+ "spec/data/models.rb",
36
+ "spec/mongoid_globalize/attributes_spec.rb",
37
+ "spec/mongoid_globalize/clone_spec.rb",
38
+ "spec/mongoid_globalize/dirty_tracking_spec.rb",
39
+ "spec/mongoid_globalize/fallbacks_spec.rb",
40
+ "spec/mongoid_globalize/locale_spec.rb",
41
+ "spec/mongoid_globalize/set_translations_spec.rb",
42
+ "spec/mongoid_globalize/translation_class_spec.rb",
43
+ "spec/mongoid_globalize/validations_spec.rb",
44
+ "spec/mongoid_globalize_spec.rb",
45
+ "spec/spec_helper.rb"
46
+ ]
47
+ s.homepage = %q{http://github.com/Mik-die/mongoid_globalize}
48
+ s.licenses = [%q{MIT}]
49
+ s.require_paths = [%q{lib}]
50
+ s.rubygems_version = %q{1.8.5}
51
+ s.summary = %q{Library for translating Mongoid documents}
52
+
53
+ if s.respond_to? :specification_version then
54
+ s.specification_version = 3
55
+
56
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
57
+ s.add_runtime_dependency(%q<activemodel>, ["= 3.1.0.rc4"])
58
+ s.add_runtime_dependency(%q<mongoid>, [">= 0"])
59
+ s.add_runtime_dependency(%q<bson_ext>, [">= 0"])
60
+ s.add_development_dependency(%q<rspec>, [">= 0"])
61
+ s.add_development_dependency(%q<mongoid-rspec>, [">= 0"])
62
+ s.add_development_dependency(%q<database_cleaner>, [">= 0"])
63
+ s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
64
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
65
+ else
66
+ s.add_dependency(%q<activemodel>, ["= 3.1.0.rc4"])
67
+ s.add_dependency(%q<mongoid>, [">= 0"])
68
+ s.add_dependency(%q<bson_ext>, [">= 0"])
69
+ s.add_dependency(%q<rspec>, [">= 0"])
70
+ s.add_dependency(%q<mongoid-rspec>, [">= 0"])
71
+ s.add_dependency(%q<database_cleaner>, [">= 0"])
72
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
73
+ s.add_dependency(%q<jeweler>, [">= 0"])
74
+ end
75
+ else
76
+ s.add_dependency(%q<activemodel>, ["= 3.1.0.rc4"])
77
+ s.add_dependency(%q<mongoid>, [">= 0"])
78
+ s.add_dependency(%q<bson_ext>, [">= 0"])
79
+ s.add_dependency(%q<rspec>, [">= 0"])
80
+ s.add_dependency(%q<mongoid-rspec>, [">= 0"])
81
+ s.add_dependency(%q<database_cleaner>, [">= 0"])
82
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
83
+ s.add_dependency(%q<jeweler>, [">= 0"])
84
+ end
85
+ end
86
+
@@ -0,0 +1,77 @@
1
+ class Post
2
+ include Mongoid::Document
3
+ include Mongoid::Globalize
4
+ belongs_to :blog
5
+ translates :title, :content
6
+
7
+ translates :published => Boolean
8
+ translates :published_at => DateTime
9
+ validates_presence_of :title
10
+ scope :with_some_title, :conditions => { :title => 'some_title' }
11
+ end
12
+
13
+ class PostTranslation
14
+ include Mongoid::Document
15
+ field :locale
16
+ field :title
17
+ field :content
18
+ field :published => Boolean
19
+ field :published_at => DateTime
20
+ embedded_in :post
21
+
22
+ def existing_method
23
+ end
24
+ end
25
+
26
+ class ReloadingPost < Post
27
+ after_create { reload }
28
+ end
29
+
30
+ class Blog
31
+ include Mongoid::Document
32
+ has_many :posts
33
+ field :name
34
+ end
35
+
36
+ class Validatee
37
+ include Mongoid::Document
38
+ include Mongoid::Globalize
39
+ translates :string
40
+ end
41
+
42
+ class Parent
43
+ include Mongoid::Document
44
+ include Mongoid::Globalize
45
+ translates :content, :type
46
+ end
47
+
48
+ class Child < Parent
49
+ end
50
+
51
+ class Comment
52
+ include Mongoid::Document
53
+ field :content
54
+ validates_presence_of :content
55
+ belongs_to :post
56
+ end
57
+
58
+ class TranslatedComment < Comment
59
+ include Mongoid::Globalize
60
+ translates :content, :title
61
+ end
62
+
63
+ class User
64
+ include Mongoid::Document
65
+ include Mongoid::Timestamps
66
+ include Mongoid::Globalize
67
+ translates :name
68
+ field :email
69
+ validates_presence_of :name, :email
70
+ end
71
+
72
+ class Task
73
+ include Mongoid::Document
74
+ include Mongoid::Globalize
75
+ fallbacks_for_empty_translations!
76
+ translates :name
77
+ end
@@ -0,0 +1,138 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe 'Attributes' do
5
+ it "defines accessors for the translated attributes" do
6
+ post = Post.new
7
+ post.should respond_to(:title)
8
+ post.should respond_to(:title=)
9
+ end
10
+
11
+ describe "attribute_names" do
12
+ it "returns translated and existing attribute names" do
13
+ Post.new(:blog_id => 5).attribute_names.should include('blog_id', 'content', 'title')
14
+ end
15
+ end
16
+
17
+ it "returns translated and regular attributes" do
18
+ post = Post.create(:title => 'foo', :blog_id => 5)
19
+ post.attributes.should include('blog_id' => 5, 'title' => 'foo', 'content' => nil)
20
+ end
21
+
22
+ describe "write_attribute for non-translated attributes" do
23
+ it "should return the value" do
24
+ user = User.create(:name => 'Max Mustermann', :email => 'max@mustermann.de')
25
+ new_email = 'm.muster@mann.de'
26
+ user.write_attribute('email', new_email).should == new_email
27
+ end
28
+ end
29
+
30
+ describe "translated_attribute_names" do
31
+ it "returns translated attribute names" do
32
+ Post.translated_attribute_names.should include(:title, :content)
33
+ end
34
+ end
35
+
36
+ describe "a translated attribute" do
37
+ describe "writer" do
38
+ it "returns its argument" do
39
+ (Post.new.title = 'foo').should == 'foo'
40
+ end
41
+ end
42
+
43
+ describe "reader" do
44
+ it "returns the correct translation for a saved record after locale switching" do
45
+ post = Post.create(:title => 'title')
46
+ post.update_attributes(:title => 'Titel', :locale => :de)
47
+ post.reload
48
+ post.should be_translated(:en).for(:title).as('title')
49
+ post.should be_translated(:de).for(:title).as('Titel')
50
+ end
51
+
52
+ it "returns the correct translation for an unsaved record after locale switching" do
53
+ post = Post.create(:title => 'title')
54
+ with_locale(:de) { post.title = 'Titel' }
55
+ post.should be_translated(:en).for(:title).as('title')
56
+ post.should be_translated(:de).for(:title).as('Titel')
57
+ end
58
+
59
+ it "returns the correct translation for both saved/unsaved records while switching locales" do
60
+ post = Post.new(:title => 'title')
61
+ with_locale(:de) { post.title = 'Titel' }
62
+ with_locale(:he) { post.title = 'שם' }
63
+ post.should be_translated(:de).for(:title).as('Titel')
64
+ post.should be_translated(:he).for(:title).as('שם')
65
+ post.should be_translated(:en).for(:title).as('title')
66
+ post.should be_translated(:he).for(:title).as('שם')
67
+ post.should be_translated(:de).for(:title).as('Titel')
68
+
69
+ post.save
70
+ post.reload
71
+ post.should be_translated(:de).for(:title).as('Titel')
72
+ post.should be_translated(:he).for(:title).as('שם')
73
+ post.should be_translated(:en).for(:title).as('title')
74
+ post.should be_translated(:he).for(:title).as('שם')
75
+ post.should be_translated(:de).for(:title).as('Titel')
76
+ end
77
+
78
+ it "returns nil if no translations are found on an unsaved record" do
79
+ post = Post.new(:title => 'foo')
80
+ post.title.should == 'foo'
81
+ post.content.should be_nil
82
+ end
83
+
84
+ it "returns nil if no translations are found on a saved record" do
85
+ post = Post.create(:title => 'foo')
86
+ post.reload
87
+ post.title.should == 'foo'
88
+ post.content.should be_nil
89
+ end
90
+ end
91
+ end
92
+
93
+ describe "before_type_cast reader" do
94
+ it "works for translated attributes" do
95
+ post = Post.create(:title => 'title')
96
+ post.update_attributes(:title => "Titel", :locale => :de)
97
+
98
+ with_locale(:en) { post.title_before_type_cast.should == 'title' }
99
+ with_locale(:de) { post.title_before_type_cast.should == 'Titel' }
100
+ end
101
+ end
102
+
103
+ it "saves all translations on an sti model after locale switching" do
104
+ child = Child.new(:content => 'foo')
105
+ with_locale(:de) { child.content = 'bar' }
106
+ with_locale(:he) { child.content = 'baz' }
107
+ child.save
108
+ child.reload
109
+ child.should be_translated(:en).for(:content).as('foo')
110
+ child.should be_translated(:de).for(:content).as('bar')
111
+ child.should be_translated(:he).for(:content).as('baz')
112
+ end
113
+
114
+ describe "attribute reader" do
115
+ it "will use the current locale on Mongoid::Globalize or I18n without arguments" do
116
+ with_locale(:de){ Post.create!(:title => 'Titel', :content => 'Inhalt') }
117
+ I18n.locale = :de
118
+ Post.first.title.should == 'Titel'
119
+ I18n.locale = :en
120
+ Mongoid::Globalize.locale = :de
121
+ Post.first.title.should == 'Titel'
122
+ end
123
+
124
+ it "will use the given locale when passed a locale" do
125
+ post = with_locale(:de){ Post.create!(:title => 'Titel', :content => 'Inhalt') }
126
+ post.title(:de).should == 'Titel'
127
+ end
128
+ end
129
+
130
+ describe "modifying a translated attribute" do
131
+ it "does not change the untranslated value" do
132
+ post = Post.create(:title => 'title')
133
+ before = post.untranslated_attributes['title']
134
+ post.title = 'changed title'
135
+ post.untranslated_attributes['title'].should == before
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "Clone" do
5
+ it 'stores translations from clonned new record' do
6
+ check_stored_translations(standard_post.clone)
7
+ end
8
+
9
+ it 'stores translations from clonned created record' do
10
+ clonned = saved_post.clone
11
+ check_stored_translations(clonned)
12
+ end
13
+
14
+ it 'stores translations from clonned found record' do
15
+ check_stored_translations( Post.find(saved_post.id).clone )
16
+ end
17
+
18
+ it 'stores translations from clonned reloaded after creation record' do
19
+ check_stored_translations(saved_post.reload.clone)
20
+ end
21
+ end
22
+
23
+ def standard_post
24
+ post = Post.new({:title => 'title', :content => 'content'})
25
+ with_locale(:he) { post.title= 'שם' }
26
+ post
27
+ end
28
+
29
+ def saved_post
30
+ standard_post.tap{|p| p.save!}
31
+ end
32
+
33
+ def translations_modifications(clonned)
34
+ clonned.content = 'another content'
35
+ with_locale(:de) { clonned.title = 'Titel' }
36
+ end
37
+
38
+ def translations_specs(clonned)
39
+ clonned.should be_translated(:en).for(:title).as('title') # original
40
+ clonned.should be_translated(:en).for(:content).as('another content') # changed
41
+ clonned.should be_translated(:de).for(:title).as('Titel') # new
42
+ clonned.should be_translated(:he).for(:title).as('שם') # untouched language
43
+ end
44
+
45
+ def check_stored_translations(clonned)
46
+ translations_modifications(clonned)
47
+ translations_specs(clonned)
48
+ clonned.save!
49
+ clonned.reload
50
+ translations_specs(clonned)
51
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "Dirty tracking" do
5
+ it "works" do
6
+ post = Post.create(:title => 'title', :content => 'content')
7
+ post.changed.should == []
8
+
9
+ post.title = 'title'
10
+ post.changed.should == []
11
+
12
+ post.title = 'changed title'
13
+ post.changed.should == ['title']
14
+
15
+ post.content = 'changed content'
16
+ post.changed.should include('title', 'content')
17
+ end
18
+
19
+ it 'works per a locale' do
20
+ post = Post.create(:title => 'title', :content => 'content')
21
+ post.changed.should == []
22
+
23
+ post.title = 'changed title'
24
+ post.changes.should == { 'title' => ['title', 'changed title'] }
25
+ post.save
26
+
27
+ I18n.locale = :de
28
+ post.title = 'Alt Titel'
29
+
30
+ post.title = 'Titel'
31
+ post.changes.should == { 'title' => [nil, 'Titel'] }
32
+ end
33
+
34
+ it 'works after locale switching' do
35
+ post = Post.create(:title => 'title', :content => 'content')
36
+ post.changed.should == []
37
+
38
+ post.title = 'changed title'
39
+ I18n.locale = :de
40
+ post.changed.should == ['title']
41
+ end
42
+
43
+ it 'works on sti model' do
44
+ child = Child.create(:content => 'foo')
45
+ child.changed.should == []
46
+
47
+ child.content = 'bar'
48
+ child.changed.should == ['content']
49
+
50
+ child.content = 'baz'
51
+ child.changed.should include('content')
52
+ end
53
+
54
+ it 'works on sti model after locale switching' do
55
+ child = Child.create(:content => 'foo')
56
+ child.changed.should == []
57
+
58
+ child.content = 'bar'
59
+ I18n.locale = :de
60
+ child.changed.should == ['content']
61
+ end
62
+ end
@@ -0,0 +1,135 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "Fallbacks" do
5
+ before :each do
6
+ @previous_backend = I18n.backend
7
+ I18n.pretend_fallbacks
8
+ I18n.backend = BackendWithFallbacks.new
9
+
10
+ I18n.locale = :'en-US'
11
+ I18n.fallbacks = ::I18n::Locale::Fallbacks.new
12
+ end
13
+
14
+ after :each do
15
+ I18n.fallbacks.clear
16
+ I18n.hide_fallbacks
17
+ I18n.backend = @previous_backend
18
+ end
19
+
20
+ it "keep one field in new locale when other field is changed" do
21
+ I18n.fallbacks.map('de-DE' => [ 'en-US' ])
22
+ post = Post.create :title => 'foo'
23
+ I18n.locale = 'de-DE'
24
+ post.content = 'bar'
25
+ post.title.should == 'foo'
26
+ end
27
+
28
+ it "modify non-required field in a new locale" do
29
+ I18n.fallbacks.map 'de-DE' => [ 'en-US' ]
30
+ post = Post.create :title => 'foo'
31
+ I18n.locale = 'de-DE'
32
+ post.content = 'bar'
33
+ post.save.should be_true
34
+ end
35
+
36
+ it "resolve a simple fallback" do
37
+ I18n.locale = 'de-DE'
38
+ post = Post.create :title => 'foo'
39
+
40
+ I18n.locale = 'de'
41
+ post.title = 'baz'
42
+ post.content = 'bar'
43
+ post.save!
44
+
45
+ I18n.locale = 'de-DE'
46
+ post.title.should == 'foo'
47
+ post.content.should == 'bar'
48
+ end
49
+
50
+ it "resolve a simple fallback without reloading" do
51
+ I18n.locale = 'de-DE'
52
+ post = Post.new :title => 'foo'
53
+
54
+ I18n.locale = 'de'
55
+ post.title = 'baz'
56
+ post.content = 'bar'
57
+
58
+ I18n.locale = 'de-DE'
59
+ post.title.should == 'foo'
60
+ post.content.should == 'bar'
61
+ end
62
+
63
+ it "resolve a complex fallback without reloading" do
64
+ I18n.fallbacks.map 'de' => %w(en he)
65
+ I18n.locale = 'de'
66
+ post = Post.new
67
+ I18n.locale = 'en'
68
+ post.title = 'foo'
69
+ I18n.locale = 'he'
70
+ post.title = 'baz'
71
+ post.content = 'bar'
72
+ I18n.locale = 'de'
73
+ post.title.should == 'foo'
74
+ post.content.should == 'bar'
75
+ end
76
+
77
+ it 'work with lots of locale switching' do
78
+ I18n.fallbacks.map :'de-DE' => [ :'en-US' ]
79
+ post = Post.create :title => 'foo'
80
+ I18n.locale = :'de-DE'
81
+ post.title.should == 'foo'
82
+
83
+ I18n.locale = :'en-US'
84
+ post.update_attributes(:title => 'bar')
85
+ I18n.locale = :'de-DE'
86
+ post.title.should == 'bar'
87
+ end
88
+
89
+ it 'work with lots of locale switching 2' do
90
+ I18n.fallbacks.map :'de-DE' => [ :'en-US' ]
91
+ child = Child.create :content => 'foo'
92
+ I18n.locale = :'de-DE'
93
+ child.content.should == 'foo'
94
+
95
+ I18n.locale = :'en-US'
96
+ child.update_attributes(:content => 'bar')
97
+ I18n.locale = :'de-DE'
98
+ child.content.should == 'bar'
99
+ end
100
+
101
+ it 'work with nil translations' do
102
+ I18n.fallbacks.map :'de-DE' => [ :'en-US' ]
103
+ post = Post.create :title => 'foo'
104
+ I18n.locale = :'de-DE'
105
+ post.title.should == 'foo'
106
+
107
+ post.update_attribute :title, nil
108
+ post.title.should == 'foo'
109
+ end
110
+
111
+ it 'work with empty translations' do
112
+ I18n.fallbacks.map :'de-DE' => [ :'en-US' ]
113
+ task = Task.create :name => 'foo'
114
+ I18n.locale = :'de-DE'
115
+ task.name.should == 'foo'
116
+
117
+ task.update_attribute :name, ''
118
+ task.name.should == 'foo'
119
+ end
120
+
121
+ it 'work with empty translations 2' do
122
+ I18n.fallbacks.map :'de-DE' => [ :'en-US' ]
123
+ task = Task.create :name => 'foo'
124
+ post = Post.create :title => 'foo'
125
+ I18n.locale = :'de-DE'
126
+ task.name.should == 'foo'
127
+ post.title.should == 'foo'
128
+
129
+ task.update_attribute :name, ''
130
+ task.name.should == 'foo'
131
+
132
+ post.update_attribute :title, ''
133
+ post.title.should == ''
134
+ end
135
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Mongoid::Globalize do
5
+ it "has locale accessors" do
6
+ Mongoid::Globalize.should respond_to(:locale)
7
+ Mongoid::Globalize.should respond_to(:locale=)
8
+ end
9
+
10
+ describe "#locale reader" do
11
+ it "can be called before a locale was set" do
12
+ Mongoid::Globalize.locale = nil
13
+ lambda{ Mongoid::Globalize.locale }.should_not raise_error
14
+ end
15
+ end
16
+
17
+ describe 'locale setting' do
18
+ it "works" do
19
+ I18n.locale.should == :en
20
+ Mongoid::Globalize.locale.should == :en
21
+
22
+ I18n.locale = :de
23
+ I18n.locale.should == :de
24
+ Mongoid::Globalize.locale.should == :de
25
+
26
+ Mongoid::Globalize.locale = :es
27
+ I18n.locale.should == :de
28
+ Mongoid::Globalize.locale.should == :es
29
+
30
+ I18n.locale = :fr
31
+ I18n.locale.should == :fr
32
+ Mongoid::Globalize.locale.should == :es
33
+ end
34
+
35
+ it "works with strings" do
36
+ I18n.locale = 'de'
37
+ Mongoid::Globalize.locale = 'de'
38
+ Mongoid::Globalize.locale.should == I18n.locale
39
+
40
+ I18n.locale = 'de'
41
+ Mongoid::Globalize.locale = :de
42
+ Mongoid::Globalize.locale.should == I18n.locale
43
+
44
+ I18n.locale = :de
45
+ Mongoid::Globalize.locale = 'de'
46
+ Mongoid::Globalize.locale.should == I18n.locale
47
+ end
48
+ end
49
+
50
+ describe "with_locale" do
51
+ it "temporarily sets the given locale and yields the block" do
52
+ Mongoid::Globalize.locale.should == :en
53
+ Mongoid::Globalize.with_locale :de do |locale|
54
+ Mongoid::Globalize.locale.should == :de
55
+ locale.should == :de
56
+ end
57
+ Mongoid::Globalize.locale.should == :en
58
+ end
59
+
60
+ it "calls block once with each locale given temporarily set" do
61
+ locales = Mongoid::Globalize.with_locales :en, [:de, :fr] do |locale|
62
+ Mongoid::Globalize.locale.should == locale
63
+ locale
64
+ end
65
+ locales.should == [:en, :de, :fr]
66
+ end
67
+ end
68
+
69
+ describe "attribute saving" do
70
+ it "goes by content locale and not global locale" do
71
+ Mongoid::Globalize.locale = :de
72
+ I18n.locale.should == :en
73
+ Post.create :title => 'foo'
74
+ Post.first.translations.first.locale.should == :de
75
+ end
76
+ end
77
+
78
+ describe "attribute loading" do
79
+ it "goes by content locale and not global locale" do
80
+ post = Post.create(:title => 'title')
81
+ Post.first.should be_translated(:en).for(:title).as('title')
82
+
83
+ Mongoid::Globalize.locale = :de
84
+ post.update_attributes(:title => 'Titel')
85
+ Post.first.should be_translated(:en).for(:title).as('title')
86
+ Post.first.should be_translated(:de).for(:title).as('Titel')
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "#set_translations" do
5
+ it "sets multiple translations at once" do
6
+ post = Post.create(:title => 'title', :content => 'content', :locale => :en)
7
+ post.update_attributes(:title => 'Titel', :content => 'Inhalt', :locale => :de)
8
+ post.set_translations(
9
+ :en => { :title => 'updated title', :content => 'updated content' },
10
+ :de => { :title => 'geänderter Titel', :content => 'geänderter Inhalt' }
11
+ )
12
+ post.reload
13
+ post.should be_translated(:en).for([:title, :content])
14
+ .as(['updated title', 'updated content'])
15
+ post.should be_translated(:de).for([:title, :content])
16
+ .as(['geänderter Titel', 'geänderter Inhalt'])
17
+ end
18
+
19
+ it "does not touch existing translations for other locales" do
20
+ post = Post.create(:title => 'title', :content => 'content', :locale => :en)
21
+ post.update_attributes(:title => 'Titel', :content => 'Inhalt', :locale => :de)
22
+ post.set_translations(:en => { :title => 'updated title', :content => 'updated content' })
23
+ post.reload
24
+ post.should be_translated(:en).for([:title, :content])
25
+ .as(['updated title', 'updated content'])
26
+ post.should be_translated(:de).for([:title, :content]).as(['Titel', 'Inhalt'])
27
+ end
28
+
29
+ it "does not touch existing translations for other attributes" do
30
+ post = Post.create(:title => 'title', :content => 'content', :locale => :en)
31
+ post.update_attributes(:title => 'Titel', :content => 'Inhalt', :locale => :de)
32
+ post.set_translations(
33
+ :en => { :title => "updated title" },
34
+ :de => { :content => "geänderter Inhalt" }
35
+ )
36
+ post.reload
37
+ post.should be_translated(:en).for([:title, :content]).as(['updated title', 'content'])
38
+ post.should be_translated(:de).for([:title, :content]).as(['Titel', 'geänderter Inhalt'])
39
+ end
40
+
41
+ # in G3 error raises here. But Mongo it support, so why not.. :)
42
+ it "sets unknown attributes" do
43
+ post = Post.create(:title => 'title', :content => 'content', :locale => :en)
44
+ post.update_attributes(:title => 'Titel', :content => 'Inhalt', :locale => :de)
45
+ post.set_translations :de => {:does_not_exist => 'not exist'}
46
+ post.reload
47
+ post.translation_for(:de).does_not_exist.should == 'not exist'
48
+ end
49
+ end