ixtlan 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/History.txt +49 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Manifest.txt +73 -48
  4. data/Rakefile +1 -1
  5. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/gwt_ixtlan_datamapper_rspec_scaffold_generator.rb +3 -3
  6. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/AbstractApplicationResourceTestGwt.java +1 -1
  7. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Fields.java +1 -1
  8. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Model.java +2 -2
  9. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/ModelFactory.java +2 -2
  10. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Screen.java +2 -2
  11. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/TestGwt.java +2 -2
  12. data/generators/ixtlan_datamapper_rspec_model/ixtlan_datamapper_rspec_model_generator.rb +1 -1
  13. data/generators/ixtlan_datamapper_rspec_scaffold/ixtlan_datamapper_rspec_scaffold_generator.rb +4 -4
  14. data/generators/ixtlan_datamapper_rspec_scaffold/templates/guard.rb +7 -7
  15. data/generators/ixtlan_datamapper_rspec_scaffold/templates/i18n.rb +1 -1
  16. data/generators/ixtlan_datamapper_rspec_scaffold/templates/layout.html.erb +20 -0
  17. data/ixtlan_rails_templates.rb +537 -0
  18. data/lib/ixtlan/audit_config.rb +5 -5
  19. data/lib/ixtlan/child_path.rb +2 -2
  20. data/lib/ixtlan/cms_script.rb +4 -4
  21. data/lib/ixtlan/controllers/authentications_controller.rb +7 -2
  22. data/lib/ixtlan/controllers/configurations_controller.rb +15 -6
  23. data/lib/ixtlan/controllers/domains_controller.rb +99 -0
  24. data/lib/ixtlan/controllers/groups_controller.rb +105 -0
  25. data/lib/ixtlan/controllers/locales_controller.rb +99 -0
  26. data/lib/ixtlan/controllers/permissions_controller.rb +5 -0
  27. data/lib/ixtlan/controllers/phrases_controller.rb +26 -22
  28. data/lib/ixtlan/controllers/search_query.rb +24 -0
  29. data/lib/ixtlan/controllers/texts_controller.rb +5 -5
  30. data/lib/ixtlan/controllers/users_controller.rb +117 -0
  31. data/lib/ixtlan/controllers/word_bundles_controller.rb +13 -8
  32. data/lib/ixtlan/digest.rb +3 -3
  33. data/lib/ixtlan/guard.rb +11 -12
  34. data/lib/ixtlan/logger_config.rb +11 -11
  35. data/lib/ixtlan/mailer/error_notification.erb +1 -0
  36. data/lib/ixtlan/mailer/password.erb +1 -0
  37. data/lib/ixtlan/mailer.rb +27 -0
  38. data/lib/ixtlan/models/authentication.rb +9 -6
  39. data/lib/ixtlan/models/configuration.rb +21 -37
  40. data/lib/ixtlan/models/configuration_locale.rb +3 -3
  41. data/lib/ixtlan/models/domain.rb +44 -0
  42. data/lib/ixtlan/models/domain_group_user.rb +22 -0
  43. data/lib/ixtlan/models/group.rb +82 -16
  44. data/lib/ixtlan/models/group_locale_user.rb +4 -4
  45. data/lib/ixtlan/models/group_user.rb +7 -7
  46. data/lib/ixtlan/models/i18n_text.rb +26 -26
  47. data/lib/ixtlan/models/locale.rb +17 -5
  48. data/lib/ixtlan/models/permission.rb +3 -2
  49. data/lib/ixtlan/models/phrase.rb +15 -15
  50. data/lib/ixtlan/models/role.rb +5 -5
  51. data/lib/ixtlan/models/translation.rb +9 -9
  52. data/lib/ixtlan/models/update_children.rb +74 -0
  53. data/lib/ixtlan/models/user.rb +108 -16
  54. data/lib/ixtlan/models/word.rb +2 -1
  55. data/lib/ixtlan/models.rb +1 -0
  56. data/lib/ixtlan/modified_by.rb +9 -7
  57. data/lib/ixtlan/monkey_patches.rb +5 -5
  58. data/lib/ixtlan/optimistic_persistence.rb +2 -2
  59. data/lib/ixtlan/optimistic_persistence_module.rb +3 -3
  60. data/lib/ixtlan/optimistic_persistence_validation.rb +2 -2
  61. data/lib/ixtlan/passwords.rb +15 -13
  62. data/lib/ixtlan/rails/error_handling.rb +41 -40
  63. data/lib/ixtlan/rails/guard.rb +0 -1
  64. data/lib/ixtlan/rails/migrations.rb +75 -0
  65. data/lib/ixtlan/rails/session_timeout.rb +16 -14
  66. data/lib/ixtlan/rails/timestamps_modified_by_filter.rb +1 -1
  67. data/lib/ixtlan/rails/unrestful_authentication.rb +4 -4
  68. data/lib/ixtlan/rolling_file.rb +3 -3
  69. data/lib/ixtlan/session.rb +4 -3
  70. data/lib/ixtlan/user_logger.rb +13 -9
  71. data/lib/ixtlan/version.rb +1 -1
  72. data/spec/authentication_spec.rb +1 -1
  73. data/spec/guard_spec.rb +4 -4
  74. data/spec/guards/samples.rb +7 -7
  75. data/spec/modified_by_spec.rb +82 -0
  76. data/spec/optimistic_persistence_spec.rb +58 -0
  77. data/spec/phrase_spec.rb +119 -0
  78. data/spec/session_timeout_spec.rb +59 -0
  79. data/spec/spec_helper.rb +6 -5
  80. data/spec/text_collection_spec.rb +88 -0
  81. data/spec/text_spec.rb +105 -0
  82. data/spec/unrestful_authentication_spec.rb +142 -0
  83. data/spec/user_logger_spec.rb +105 -0
  84. data/spec/user_spec.rb +249 -0
  85. data/whitespace.rb +31 -0
  86. metadata +76 -50
  87. data/lib/ixtlan/error_notifier/error_notification.rhtml +0 -1
@@ -0,0 +1,119 @@
1
+ require 'pathname'
2
+ require Pathname(__FILE__).dirname + 'spec_helper.rb'
3
+
4
+ require Pathname(__FILE__).dirname + '../lib/dm-serializer/to_xml'
5
+
6
+
7
+ require 'ixtlan/controllers/texts_controller'
8
+
9
+ require 'ixtlan/models/i18n_text'
10
+ require 'ixtlan/models/word'
11
+ require 'ixtlan/models/translation'
12
+ require 'ixtlan/models/phrase'
13
+
14
+ def setup(code)
15
+ len = 6
16
+ Controller.send(:include, Ixtlan::Controllers::TextsController)
17
+ Ixtlan::Models::I18nText.all.destroy!
18
+ Ixtlan::Models::Locale.all.destroy!
19
+ Ixtlan::Models::Locale.first_or_create(:id => 1, :code => "DEFAULT")
20
+ @controller2 = Controller.new
21
+ @en = Ixtlan::Models::Locale.first_or_create(:id => 1000, :code => "en")
22
+ @en_in = Ixtlan::Models::Locale.first_or_create(:id => 2000, :code => "en_IN")
23
+ (1..len).each do |j|
24
+ text = Ixtlan::Models::I18nText.create(:id => j,
25
+ :code => code,
26
+ :text => "text_#{j}",
27
+ :current_user => @controller2.current_user,
28
+ :locale => Ixtlan::Models::Locale.default,
29
+ :updated_at => DateTime.now,
30
+ :updated_by => @controller2.current_user)
31
+
32
+ text.approve(:current_user => @controller2.current_user)
33
+ end
34
+ end
35
+
36
+ #describe Ixtlan::Models::Phrase do
37
+
38
+
39
+ describe "with default locale" do
40
+ before(:each) do
41
+ setup("cccc_1")
42
+ end
43
+ it "should xml-serialize" do
44
+ #Ixtlan::Models::I18nText.all.each {|t| p t}
45
+ Ixtlan::Models::Phrase.all(:code => "cccc_1").to_xml.cleanup.should == "<phrases><phrase><code>cccc_1</code><text>text_6</text><current_text>text_6</current_text><updated_at>date</updated_at><updated_by_id>1</updated_by_id><locale><id>1</id><code>DEFAULT</code><created_at>date</created_at></locale></phrase></phrases>"
46
+ end
47
+ end
48
+
49
+ describe "with default locale" do
50
+ before(:each) do
51
+ setup("cccc_2")
52
+ end
53
+ it "should xml-serialize with edited text" do
54
+ Ixtlan::Models::I18nText.create(:code => "cccc_2",
55
+ :text => "text_edited",
56
+ :current_user => @controller2.current_user,
57
+ :locale => Ixtlan::Models::Locale.default,
58
+ :updated_at => DateTime.now,
59
+ :updated_by => @controller2.current_user)
60
+ # Ixtlan::Models::I18nText.all.each {|t| p t}
61
+ Ixtlan::Models::Phrase.all(:code => "cccc_2").to_xml.cleanup.should == "<phrases><phrase><code>cccc_2</code><text>text_edited</text><current_text>text_6</current_text><updated_at>date</updated_at><updated_by_id>1</updated_by_id><locale><id>1</id><code>DEFAULT</code><created_at>date</created_at></locale></phrase></phrases>"
62
+ end
63
+
64
+ end
65
+ describe "with default locale" do
66
+ before(:each) do
67
+ setup("cccc_3")
68
+ Ixtlan::Models::I18nText.all.destroy!
69
+ end
70
+
71
+ it "should xml-serialize with edited text and not approved" do
72
+ Ixtlan::Models::I18nText.create(:code => "cccc_3",
73
+ :text => "text_edited",
74
+ :current_user => @controller2.current_user,
75
+ :locale => Ixtlan::Models::Locale.default,
76
+ :updated_at => DateTime.now,
77
+ :updated_by => @controller2.current_user)
78
+ #Ixtlan::Models::I18nText.all.each {|t| p t}
79
+ Ixtlan::Models::Phrase.all(:code => "cccc_3").to_xml.cleanup.should == "<phrases><phrase><code>cccc_3</code><text>text_edited</text><current_text>text_edited</current_text><updated_at>date</updated_at><updated_by_id>1</updated_by_id><locale><id>1</id><code>DEFAULT</code><created_at>date</created_at></locale></phrase></phrases>"
80
+ end
81
+ end
82
+
83
+ describe "with 'de' locale" do
84
+ before(:each) do
85
+ setup("de_code")
86
+ end
87
+ it "should xml-serialize" do
88
+ #Ixtlan::Models::I18nText.all.each {|t| p t}
89
+ Ixtlan::Models::Phrase.all(:code => "de_code", :locale => Ixtlan::Models::Locale.first_or_create(:id => 3000, :code => 'de')).to_xml.cleanup.should == "<phrases><phrase><code>de_code</code><text>text_6</text><current_text>text_6</current_text><updated_at>date</updated_at><updated_by_id>1</updated_by_id><default_translation><text>text_6</text><previous_text>text_5</previous_text><approved_at>date</approved_at><approved_by_id>1</approved_by_id></default_translation><locale><id>3000</id><code>de</code><created_at>date</created_at></locale></phrase></phrases>"
90
+ end
91
+ end
92
+
93
+ describe "with 'en' locale" do
94
+ before(:each) do
95
+ setup("en_code")
96
+
97
+ Ixtlan::Models::I18nText.create(:code => "en_code",
98
+ :text => "en_text_edited",
99
+ :current_user => @controller2.current_user,
100
+ :locale => @en,
101
+ :updated_at => DateTime.now,
102
+ :updated_by => @controller2.current_user)
103
+ Ixtlan::Models::I18nText.create(:code => "en_code",
104
+ :text => "en_in_text_edited",
105
+ :current_user => @controller2.current_user,
106
+ :locale => @en_in,
107
+ :updated_at => DateTime.now,
108
+ :updated_by => @controller2.current_user)
109
+ end
110
+
111
+ it "should xml-serialize with edited text" do
112
+ #Ixtlan::Models::I18nText.all(:code => "en_code").each {|t| puts "code=#{t.code} locale=#{t.locale.code} version=#{t.version} current=#{t.current} previous=#{t.previous}"}
113
+ Ixtlan::Models::Phrase.all(:code => "en_code", :locale => @en).to_xml.cleanup.should == "<phrases><phrase><code>en_code</code><text>en_text_edited</text><current_text>en_text_edited</current_text><updated_at>date</updated_at><updated_by_id>1</updated_by_id><default_translation><text>text_6</text><previous_text>text_5</previous_text><approved_at>date</approved_at><approved_by_id>1</approved_by_id></default_translation><locale><id>1000</id><code>en</code><created_at>date</created_at></locale></phrase></phrases>"
114
+ end
115
+
116
+ end
117
+
118
+
119
+ #end
@@ -0,0 +1,59 @@
1
+ require 'pathname'
2
+ require Pathname(__FILE__).dirname + 'spec_helper.rb'
3
+
4
+ require 'ixtlan/rails/session_timeout'
5
+
6
+ class Controller
7
+ include Ixtlan::Rails::SessionTimeout
8
+ end
9
+
10
+ describe Ixtlan::Rails::SessionTimeout do
11
+
12
+ before :each do
13
+ Ixtlan::Models::User.all.destroy!
14
+ @controller = Controller.new
15
+ @log = StringIO.new
16
+ Slf4r::LoggerFacade4RubyLogger.file = @log
17
+ end
18
+
19
+ it 'should expire due to idle timeout' do
20
+ @controller.send(:check_session_expiry).should be_true
21
+ @controller.session.empty?.should be_false
22
+ @controller.rendered.should be_nil
23
+ @log.string.size.should == 0
24
+ sleep 1
25
+ @controller.send(:check_session_expiry).should be_false
26
+ @controller.session.empty?.should be_true
27
+ @controller.rendered.should be_true
28
+ @log.string.size.should_not == 0
29
+ @log.string.should =~ /session timeout/
30
+ end
31
+
32
+ it 'should expire due to IP change' do
33
+ @controller.request.headers['REMOTE_ADDR'] = "first.ip"
34
+ @controller.send(:check_session_ip_binding).should be_true
35
+ @controller.session.empty?.should be_false
36
+ @controller.rendered.should be_nil
37
+ @log.string.size.should == 0
38
+ @controller.request.headers['REMOTE_ADDR'] = "second.ip"
39
+ @controller.send(:check_session_ip_binding).should be_false
40
+ @controller.session.empty?.should be_true
41
+ @controller.rendered.should be_true
42
+ @log.string.size.should_not == 0
43
+ @log.string.should =~ /IP changed/
44
+ end
45
+
46
+ it 'should expire due to IP change' do
47
+ @controller.request.headers['HTTP_USER_AGENT'] = "mozilla"
48
+ @controller.send(:check_session_browser_signature).should be_true
49
+ @controller.session.empty?.should be_false
50
+ @controller.rendered.should be_nil
51
+ @log.string.size.should == 0
52
+ @controller.request.headers['HTTP_USER_AGENT'] = "iron"
53
+ @controller.send(:check_session_browser_signature).should be_false
54
+ @controller.session.empty?.should be_true
55
+ @controller.rendered.should be_true
56
+ @log.string.size.should_not == 0
57
+ @log.string.should =~ /browser signature changed/
58
+ end
59
+ end
data/spec/spec_helper.rb CHANGED
@@ -12,9 +12,10 @@ require 'slf4r'
12
12
  require 'ixtlan' / 'models'
13
13
  require 'ixtlan' / 'user_logger'
14
14
  require 'ixtlan' / 'modified_by'
15
- require 'ixtlan' / 'models' / 'user'
15
+ require 'ixtlan' / 'models' / 'domain'
16
16
  require 'ixtlan' / 'models' / 'locale'
17
17
  require 'ixtlan' / 'models' / 'group'
18
+ require 'ixtlan' / 'models' / 'user'
18
19
  require 'ixtlan' / 'models' / 'configuration'
19
20
  require 'ixtlan' / 'models' / 'group_user'
20
21
  require 'ixtlan' / 'models' / 'group_locale_user'
@@ -64,7 +65,7 @@ class Controller
64
65
  def initialize
65
66
  @params = {}
66
67
  u = Ixtlan::Models::User.first(:login => :marvin)
67
- if u.nil?
68
+ if u.nil?
68
69
  u = Ixtlan::Models::User.new(:login => :marvin, :name => 'marvin the robot', :email=> "marvin@universe.example.com", :language => "xx", :id => 1, :created_at => DateTime.now, :updated_at => DateTime.now)
69
70
  if(u.respond_to? :created_by_id)
70
71
  u.created_by_id = 1
@@ -132,15 +133,15 @@ if RUBY_PLATFORM =~ /java/
132
133
  module DataMapper
133
134
  module Validate
134
135
  class NumericValidator
135
-
136
+
136
137
  def validate_with_comparison(value, cmp, expected, error_message_name, errors, negated = false)
137
138
  return if expected.nil?
138
- if cmp == :=~
139
+ if cmp == :=~
139
140
  return value =~ expected
140
141
  end
141
142
  comparison = value.send(cmp, expected)
142
143
  return if negated ? !comparison : comparison
143
-
144
+
144
145
  errors << ValidationErrors.default_error_message(error_message_name, field_name, expected)
145
146
  end
146
147
  end
@@ -0,0 +1,88 @@
1
+
2
+ require 'pathname'
3
+ require Pathname(__FILE__).dirname + 'spec_helper.rb'
4
+
5
+ require 'ixtlan/controllers/texts_controller'
6
+
7
+ require 'ixtlan/models/i18n_text'
8
+ require 'ixtlan/models/word'
9
+ require 'ixtlan/models/translation'
10
+
11
+ describe "Ixtlan::Models::TextCollection" do
12
+
13
+ len = 6
14
+
15
+ before(:all) do
16
+ Controller.send(:include, Ixtlan::Controllers::TextsController)
17
+ @controller = Controller.new
18
+ Ixtlan::Models::Locale.all.destroy!
19
+ Ixtlan::Models::I18nText.all.destroy!
20
+ (1..len).each do |i|
21
+ locale = Ixtlan::Models::Locale.first_or_create(:id => 10 + len + i, :code => "c#{(96 +i).chr}")
22
+ text = Ixtlan::Models::I18nText.create(:code => "code_#{i}",
23
+ :text => "text_#{i}",
24
+ :current_user => @controller.current_user,
25
+ :locale => Ixtlan::Models::Locale.default,
26
+ :updated_at => DateTime.now,
27
+ :updated_by => @controller.current_user)
28
+ text.approve(:current_user => @controller.current_user)
29
+ (1..len).each do |j|
30
+ text = Ixtlan::Models::I18nText.create(:code => "code_#{i}", :text => "text_#{i}_#{j}",
31
+ :current_user => @controller.current_user, :locale => locale, :updated_at => DateTime.now, :updated_by => @controller.current_user)
32
+ text.approve(:current_user => @controller.current_user) unless j == len
33
+ end
34
+ end
35
+ end
36
+
37
+ it "should have #{len} second latest approved" do
38
+ set = Ixtlan::Models::I18nText.second_latest_approved
39
+ set.size.should == len
40
+ set.each do |t|
41
+ t.version.should_not be_nil
42
+ t.current.should be_false
43
+ t.previous.should be_true
44
+ end
45
+ end
46
+
47
+ it "should have #{len * 2} latest approved" do
48
+ set = Ixtlan::Models::I18nText.latest_approved
49
+ set.size.should == len * 2
50
+ set.each do |t|
51
+ t.version.should_not be_nil
52
+ t.current.should be_true
53
+ t.previous.should be_false
54
+ end
55
+ end
56
+
57
+ it "should have #{len} not approved" do
58
+ set = Ixtlan::Models::I18nText.not_approved
59
+ set.size.should == len
60
+ set.each do |t|
61
+ t.version.should be_nil
62
+ t.current.should be_false
63
+ t.previous.should be_false
64
+ end
65
+ end
66
+
67
+ it "should have #{len * len} approved" do
68
+ Ixtlan::Models::I18nText.approved.size.should == len * len
69
+ end
70
+
71
+ it "should have #{len * (len - 3)} old approved" do
72
+ Ixtlan::Models::I18nText.all(:current => false, :previous => false, :version.not => nil).size.should == len * (len - 3)
73
+ end
74
+
75
+ it "should have right number of approved when filterd by locale " do
76
+ locale = Ixtlan::Models::Locale.first_or_create(:code => "cb")
77
+ Ixtlan::Models::I18nText.approved(:locale => locale).size.should == len - 1
78
+ Ixtlan::Models::I18nText.latest_approved(:locale => locale).size.should == 1
79
+ Ixtlan::Models::I18nText.not_approved(:locale => locale).size.should == 1
80
+ end
81
+
82
+ it 'should setup the translation map' do
83
+ locale = Ixtlan::Models::Locale.first_or_create(:code => "cb")
84
+ map = Ixtlan::Models::Translation.map_for(:locale => locale)
85
+ map.size.should == 1
86
+ map.values[0].to_xml.gsub(/ type='[a-z:]*'/, '').gsub(/[0-9-]+T[0-9:]+\+[0-9:]+/, 'date').should == "<translation><text>text_2_5</text><previous_text>text_2_4</previous_text><approved_at>date</approved_at><approved_by_id>1</approved_by_id></translation>"
87
+ end
88
+ end
data/spec/text_spec.rb ADDED
@@ -0,0 +1,105 @@
1
+
2
+ require 'pathname'
3
+ require Pathname(__FILE__).dirname + 'spec_helper.rb'
4
+
5
+ require 'ixtlan/controllers/texts_controller'
6
+
7
+ require 'ixtlan/models/i18n_text'
8
+ require 'ixtlan/models/word'
9
+ require 'ixtlan/models/translation'
10
+
11
+ describe Ixtlan::Models::I18nText do
12
+
13
+ before(:each) do
14
+ @controller = Controller.new
15
+ Ixtlan::Models::I18nText.all.destroy!
16
+ @approved = Ixtlan::Models::I18nText.create(:code => "code", :text => "other text", :current_user => @controller.current_user, :locale => Ixtlan::Models::Locale.default)
17
+ @approved.approve(:current_user => @controller.current_user)
18
+ @text = Ixtlan::Models::I18nText.create(:code => "code", :text => "text", :current_user => @controller.current_user, :locale => Ixtlan::Models::Locale.default)
19
+ end
20
+
21
+ it "should create default" do
22
+ @text.new?.should_not be_nil
23
+ @text.id.should_not be_nil
24
+ @text.updated_at.should_not be_nil
25
+ @text.updated_by.should == @controller.current_user
26
+ @text.version.should be_nil
27
+ @text.current.should be_false
28
+ @text.approved_at.should be_nil
29
+ @text.approved_by.should be_nil
30
+ end
31
+
32
+ it 'should create translation' do
33
+ Ixtlan::Models::I18nText.create(:code => "code", :text => "text_en", :current_user => @controller.current_user, :locale => Ixtlan::Models::Locale.first_or_create(:code => 'en')).new?.should be_false
34
+ end
35
+
36
+ it 'should not create' do
37
+ Ixtlan::Models::I18nText.create(:code => "code2", :text => "text", :current_user => @controller.current_user, :locale => Ixtlan::Models::Locale.first_or_create(:code => 'en')).new?.should be_true
38
+ end
39
+
40
+ it 'should update' do
41
+ text = Ixtlan::Models::I18nText.create(:code => "update_code", :text => "text", :current_user => @controller.current_user, :locale => Ixtlan::Models::Locale.default)
42
+ text.update(:text => 'new text', :current_user => @controller.current_user)
43
+ text.should be_true
44
+ text.version.should be_nil
45
+ text.current.should be_false
46
+ text.approved_at.should be_nil
47
+ text.approved_by.should be_nil
48
+ end
49
+
50
+ it 'should approve' do
51
+ text = Ixtlan::Models::I18nText.create(:code => "apporved_code", :text => "text", :current_user => @controller.current_user, :locale => Ixtlan::Models::Locale.default)
52
+ text.approved?.should be_false
53
+ text.approve(:current_user => @controller.current_user).should be_true
54
+ text.version.should_not be_nil
55
+ text.approved?.should be_true
56
+ text.current.should be_true
57
+ text.approved_at.should_not be_nil
58
+ text.approved_by.should_not be_nil
59
+ end
60
+
61
+ it 'should not update unapproved when changing text and version' do
62
+ @text.attributes = {:text => 'new text', :version => 1, :current_user => @controller.current_user}
63
+ @text.save.should be_false
64
+ @text.errors[:invariant].first.should == 'can not approve and change text at the same time'
65
+ end
66
+
67
+ it 'should not update approved on text change' do
68
+
69
+ @approved.version.should_not be_nil
70
+ @approved.approved_at.should_not be_nil
71
+ @approved.approved_by.should_not be_nil
72
+
73
+ @approved.update(:text => 'new text', :current_user => @controller.current_user).should be_false
74
+ @approved.errors[:invariant].should_not be_nil
75
+ end
76
+
77
+ it 'should not update approved on version change' do
78
+ @approved.version.should_not be_nil
79
+ @approved.approved_at.should_not be_nil
80
+ @approved.approved_by.should_not be_nil
81
+
82
+ @approved.update(:version => 11, :current_user => @controller.current_user).should be_false
83
+ @approved.errors[:invariant].should_not be_nil
84
+ end
85
+
86
+ it 'should not update approved on code change' do
87
+ @approved.version.should_not be_nil
88
+ @approved.approved_at.should_not be_nil
89
+ @approved.approved_by.should_not be_nil
90
+
91
+ @approved.update(:code => "new code", :current_user => @controller.current_user).should be_false
92
+ @approved.errors[:invariant].should_not be_nil
93
+ end
94
+
95
+ it 'should not update on code change' do
96
+ @text.update(:code => "new code", :current_user => @controller.current_user).should be_false
97
+ @text.errors[:invariant].should_not be_nil
98
+ end
99
+
100
+ it 'should produce xml via the Word model' do
101
+ text = Ixtlan::Models::I18nText.create(:code => "word", :text => "word text", :current_user => @controller.current_user, :locale => Ixtlan::Models::Locale.default)
102
+ Ixtlan::Models::Word.first(:code => "word").to_xml.should == "<word><code>word</code><text>word text</text></word>"
103
+ Ixtlan::Models::Word.all(:id => @approved.id).to_xml(:collection_element_name => "words").should == "<words type='array'><word><code>code</code><text>other text</text></word></words>"
104
+ end
105
+ end
@@ -0,0 +1,142 @@
1
+
2
+ require 'pathname'
3
+ require Pathname(__FILE__).dirname + 'spec_helper.rb'
4
+
5
+ require 'ixtlan' / 'models' / 'authentication'
6
+ require 'ixtlan' / 'rails' / 'unrestful_authentication'
7
+
8
+ class Controller
9
+
10
+ include Ixtlan::Rails::UnrestfulAuthentication
11
+
12
+ attr_reader :rendered
13
+
14
+ def render_successful_login
15
+ @rendered = :login
16
+ end
17
+
18
+ def render_access_denied
19
+ @rendered = :access_denied
20
+ end
21
+
22
+ def render_login_page
23
+ @rendered = :login_page
24
+ end
25
+
26
+ def render_logout_page
27
+ @rendered = :logout_page
28
+ end
29
+
30
+ def reset
31
+ @params.clear
32
+ @rendered = nil
33
+ end
34
+ end
35
+
36
+ describe Ixtlan::Models::Authentication do
37
+
38
+ before :all do
39
+ @controller = Controller.new
40
+ @log = StringIO.new
41
+ Slf4r::LoggerFacade4RubyLogger.file = @log
42
+ end
43
+
44
+ describe "login" do
45
+
46
+ before :each do
47
+ @controller.reset
48
+ @log.reopen
49
+ end
50
+
51
+ it 'should show login page' do
52
+ @controller.send(:authenticate).should be_false
53
+ @controller.session.empty?.should be_true
54
+ @controller.rendered.should == :login_page
55
+ end
56
+
57
+ it 'should show access denied page - via put' do
58
+ @controller.request.method = :put
59
+ @controller.send(:authenticate).should be_false
60
+ @controller.session.empty?.should be_true
61
+ @controller.rendered.should == :access_denied
62
+ end
63
+
64
+ it 'should show access denied page - via delete' do
65
+ @controller.request.method = :delete
66
+ @controller.send(:authenticate).should be_false
67
+ @controller.session.empty?.should be_true
68
+ @controller.rendered.should == :access_denied
69
+ end
70
+
71
+ it 'should show access denied page - via post - no login - no password' do
72
+ @controller.request.method = :post
73
+ @controller.send(:authenticate).should be_false
74
+ @controller.session.empty?.should be_true
75
+ @controller.rendered.should == :access_denied
76
+ end
77
+
78
+ it 'should show access denied page - via post - no login' do
79
+ @controller.request.method = :post
80
+ @controller.params[:password] = @controller.password
81
+ @controller.send(:authenticate).should be_false
82
+ @log.string.should =~ /\[\?\?\?\] unknown login from IP/
83
+ @controller.session.empty?.should be_true
84
+ @controller.rendered.should == :access_denied
85
+ end
86
+
87
+ it 'should show access denied page - via post - no password' do
88
+ @controller.request.method = :post
89
+ @controller.params[:login] = @controller.user.login
90
+ @controller.send(:authenticate).should be_false
91
+ @log.string.should =~ /\[#{@controller.user.login}\] wrong password from IP/
92
+ @controller.session.empty?.should be_true
93
+ @controller.rendered.should == :access_denied
94
+ end
95
+
96
+ it 'should login' do
97
+ @controller.request.method = :post
98
+ @controller.params[:password] = @controller.password
99
+ @controller.params[:login] = @controller.user.login
100
+ @controller.send(:authenticate).should be_false
101
+ @log.string.should =~ /\[#{@controller.user.login}\] logged in/
102
+ @controller.session.empty?.should be_false
103
+ @controller.rendered.should == :login
104
+ end
105
+ end
106
+
107
+ describe 'logout' do
108
+
109
+ before :each do
110
+ @controller.request.method = :post
111
+ @controller.params[:password] = @controller.password
112
+ @controller.params[:login] = @controller.user.login
113
+ @controller.send :authenticate
114
+ @controller.reset
115
+ @log.reopen
116
+ end
117
+
118
+ it 'should do nothing' do
119
+ @controller.request.method = :get
120
+ @controller.send(:authenticate).should be_true
121
+ @log.string.should == ''
122
+ @controller.request.method = :post
123
+ @controller.send(:authenticate).should be_true
124
+ @log.string.should == ''
125
+ @controller.request.method = :put
126
+ @controller.send(:authenticate).should be_true
127
+ @log.string.should == ''
128
+ @controller.request.method = :delete
129
+ @controller.send(:authenticate).should be_true
130
+ @log.string.should == ''
131
+ @controller.rendered.should be_nil
132
+ end
133
+
134
+ it 'should logout' do
135
+ @controller.request.method = :delete
136
+ @controller.params[:login] = @controller.user.login
137
+ @controller.send(:authenticate).should be_false
138
+ @controller.rendered.should == :logout_page
139
+ @log.string.should =~ /\[#{@controller.user.login}\] logged out/
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,105 @@
1
+ require 'pathname'
2
+ require Pathname(__FILE__).dirname + 'spec_helper.rb'
3
+
4
+ require 'ixtlan/rails/session_timeout'
5
+ class Response
6
+ attr_accessor :content_type
7
+ def initialize
8
+ @content_type = ""
9
+ end
10
+ end
11
+
12
+ class Controller
13
+ def response
14
+ @response ||= Response.new
15
+ end
16
+ end
17
+
18
+ describe Ixtlan::UserLogger do
19
+
20
+ before :all do
21
+ @controller = Controller.new
22
+ end
23
+
24
+ before :each do
25
+ @controller.response.content_type = "text/html"
26
+ @log = StringIO.new
27
+ Slf4r::LoggerFacade4RubyLogger.file = @log
28
+ @logger = Ixtlan::UserLogger.new(:root)
29
+ end
30
+
31
+ it 'should log no user - no message - no block' do
32
+ @logger.log_user(nil)
33
+ @log.string.should =~ /\[\?\?\?\]\s*$/
34
+ end
35
+
36
+ it 'should log user - no message - no block' do
37
+ @logger.log_user("user")
38
+ @log.string.should =~ /\[user\]\s*$/
39
+ end
40
+
41
+ it 'should log user - message - no block' do
42
+ @logger.log_user("user", "message")
43
+ @log.string.should =~ /\[user\] message\s*$/
44
+ end
45
+
46
+ it 'should log user - no message - block' do
47
+ @logger.log_user("user") { "block" }
48
+ @log.string.should =~ /\[user\] block\s*$/
49
+ end
50
+
51
+ it 'should log - no message - block' do
52
+ @logger.log(@controller) { "block" }
53
+ @log.string.should =~ /\[marvin\] block\s*$/
54
+ end
55
+
56
+ it 'should log - message - no block' do
57
+ @logger.log(@controller, "message")
58
+ @log.string.should =~ /\[marvin\] message\s*$/
59
+ end
60
+
61
+ it 'should log - no message - no block' do
62
+ @logger.log(@controller)
63
+ @log.string.should =~ /\[marvin\] \s*$/
64
+ end
65
+
66
+ it 'should log - no controller - no message - no block' do
67
+ @logger.log(Object.new)
68
+ @log.string.should =~ /\[\?\?\?\] \s*$/
69
+ end
70
+
71
+ it 'should log action - no resource variable' do
72
+ @controller.params[:controller] = "resources"
73
+ @controller.params[:action] = "index"
74
+ @logger.log_action(@controller)
75
+ @log.string.should =~ /\[marvin\] resources#index\s*$/
76
+
77
+ @controller.response.content_type = "application/xml"
78
+ @logger.log_action(@controller)
79
+ @log.string.should =~ /\[marvin\] resources#index - xml\s*$/
80
+ end
81
+
82
+ it 'should log action - resource variable' do
83
+ @controller.params[:controller] = "resources"
84
+ @controller.params[:action] = "index"
85
+ @controller.instance_variable_set(:@resource, @controller.current_user.groups[0])
86
+ @logger.log_action(@controller)
87
+ @log.string.should =~ /\[marvin\] resources#index .*Group\([0-9]\)\s*$/
88
+ @controller.response.content_type = "application/xml"
89
+ @logger.log_action(@controller)
90
+ @log.string.should =~ /\[marvin\] resources#index .*Group\([0-9]\) - xml\s*$/
91
+ end
92
+
93
+ it 'should log action - resources variable' do
94
+ @controller.params[:controller] = "resources"
95
+ @controller.params[:action] = "index"
96
+ @controller.instance_variable_set(:@resources, @controller.current_user.groups)
97
+ size = @controller.current_user.groups.size
98
+ @logger.log_action(@controller)
99
+ @log.string.should =~ /\[marvin\] resources#index .*Groups\[#{size}\]\s*$/
100
+ @controller.response.content_type = "application/xml"
101
+ @logger.log_action(@controller)
102
+ @log.string.should =~ /\[marvin\] resources#index .*Groups\[#{size}\] - xml\s*$/
103
+ end
104
+
105
+ end