stratagem 0.2.0 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/LICENSE +29 -0
  2. data/Manifest +40 -38
  3. data/Rakefile +3 -3
  4. data/lib/stratagem.rb +22 -7
  5. data/lib/stratagem/authentication.rb +2 -1
  6. data/lib/stratagem/auto_mock/aquifer.rb +88 -15
  7. data/lib/stratagem/auto_mock/factory.rb +19 -30
  8. data/lib/stratagem/auto_mock/value_generator.rb +3 -1
  9. data/lib/stratagem/client.rb +3 -2
  10. data/lib/stratagem/crawler/authentication.rb +10 -3
  11. data/lib/stratagem/crawler/form.rb +2 -2
  12. data/lib/stratagem/crawler/html_utils.rb +12 -1
  13. data/lib/stratagem/crawler/parameter_resolver.rb +18 -4
  14. data/lib/stratagem/crawler/route_invoker.rb +58 -16
  15. data/lib/stratagem/crawler/session.rb +13 -5
  16. data/lib/stratagem/crawler/site_model.rb +20 -8
  17. data/lib/stratagem/extensions/object.rb +2 -2
  18. data/lib/stratagem/extensions/string.rb +2 -2
  19. data/lib/stratagem/instrumentation.rb +18 -0
  20. data/lib/stratagem/{framework_extensions → instrumentation}/method_invocation.rb +1 -1
  21. data/lib/stratagem/instrumentation/models.rb +25 -0
  22. data/lib/stratagem/instrumentation/models/annotations.rb +114 -0
  23. data/lib/stratagem/instrumentation/models/association.rb +40 -0
  24. data/lib/stratagem/instrumentation/models/authentication.rb +7 -0
  25. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/authlogic/detect.rb +2 -2
  26. data/lib/stratagem/instrumentation/models/authentication/authlogic/instrumentation.rb +13 -0
  27. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/authlogic/metadata.rb +1 -3
  28. data/lib/stratagem/instrumentation/models/authentication/devise/detect.rb +11 -0
  29. data/lib/stratagem/instrumentation/models/authentication/devise/instrumentation.rb +18 -0
  30. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/devise/metadata.rb +7 -3
  31. data/lib/stratagem/{framework_extensions/models/adapters/util/authentication_metadata.rb → instrumentation/models/authentication/metadata.rb} +2 -2
  32. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/restful_authentication/detect.rb +2 -4
  33. data/lib/stratagem/{framework_extensions/models/adapters/restful_authentication/extensions.rb → instrumentation/models/authentication/restful_authentication/instrumentation.rb} +1 -1
  34. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/restful_authentication/metadata.rb +2 -2
  35. data/lib/stratagem/{framework_extensions → instrumentation}/models/detect.rb +1 -1
  36. data/lib/stratagem/{framework_extensions → instrumentation}/models/metadata.rb +6 -4
  37. data/lib/stratagem/{framework_extensions → instrumentation}/models/mocking.rb +1 -1
  38. data/lib/stratagem/instrumentation/models/persistence.rb +9 -0
  39. data/lib/stratagem/instrumentation/models/persistence/active_record/detect.rb +18 -0
  40. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/active_record/extensions.rb +5 -1
  41. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/active_record/metadata.rb +25 -9
  42. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/active_record/tracing.rb +4 -2
  43. data/lib/stratagem/instrumentation/models/persistence/common/detect.rb +7 -0
  44. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/common/extensions.rb +0 -0
  45. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/common/metadata.rb +6 -2
  46. data/lib/stratagem/instrumentation/models/persistence/common/tracing.rb +4 -0
  47. data/lib/stratagem/instrumentation/models/support_libraries.rb +7 -0
  48. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/support_libraries}/friendly_id/detect.rb +2 -2
  49. data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/support_libraries}/friendly_id/metadata.rb +2 -2
  50. data/lib/stratagem/instrumentation/models/support_libraries/state_machine/detect.rb +11 -0
  51. data/lib/stratagem/instrumentation/models/support_libraries/state_machine/metadata.rb +17 -0
  52. data/lib/stratagem/{framework_extensions → instrumentation}/models/tracing.rb +2 -2
  53. data/lib/stratagem/{framework_extensions → instrumentation}/rails.rb +0 -0
  54. data/lib/stratagem/{framework_extensions → instrumentation}/rails2/action_controller.rb +0 -0
  55. data/lib/stratagem/{framework_extensions → instrumentation}/rails2/action_mailer.rb +0 -0
  56. data/lib/stratagem/{framework_extensions → instrumentation}/rails3/parameters.rb +0 -0
  57. data/lib/stratagem/{framework_extensions → instrumentation}/request_forgery_protection.rb +0 -0
  58. data/lib/stratagem/model/application.rb +30 -15
  59. data/lib/stratagem/model/components/controller.rb +2 -2
  60. data/lib/stratagem/model/components/reference.rb +2 -2
  61. data/lib/stratagem/model/components/view.rb +1 -1
  62. data/lib/stratagem/model_builder.rb +19 -8
  63. data/lib/stratagem/scanner.rb +1 -1
  64. data/lib/stratagem/site_crawler.rb +4 -2
  65. data/stratagem.gemspec +7 -7
  66. data/templates/install/tasks/stratagem.rake +9 -1
  67. metadata +86 -82
  68. data/lib/stratagem/framework_extensions.rb +0 -18
  69. data/lib/stratagem/framework_extensions/models.rb +0 -21
  70. data/lib/stratagem/framework_extensions/models/adapters/active_record/detect.rb +0 -7
  71. data/lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb +0 -10
  72. data/lib/stratagem/framework_extensions/models/adapters/authlogic/tracing.rb +0 -4
  73. data/lib/stratagem/framework_extensions/models/adapters/common/detect.rb +0 -7
  74. data/lib/stratagem/framework_extensions/models/adapters/common/tracing.rb +0 -4
  75. data/lib/stratagem/framework_extensions/models/adapters/devise/detect.rb +0 -11
  76. data/lib/stratagem/framework_extensions/models/adapters/devise/extensions.rb +0 -0
  77. data/lib/stratagem/framework_extensions/models/adapters/devise/tracing.rb +0 -4
  78. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb +0 -0
  79. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb +0 -4
  80. data/lib/stratagem/framework_extensions/models/adapters/restful_authentication/tracing.rb +0 -4
  81. data/lib/stratagem/framework_extensions/models/annotations.rb +0 -78
data/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ Copyright (c) 2010-2011 StrataGem, Inc. All rights reserved.
2
+
3
+ Certain inventions disclosed in this file may be claimed within
4
+ patents owned or patent applications filed by StrataGem, Inc. or third
5
+ parties.
6
+
7
+ Subject to the terms of this notice, StrataGem grants you a
8
+ nonexclusive, nontransferable license, without the right to
9
+ sublicense, to (a) install and execute one copy of these files on any
10
+ number of workstations owned or controlled by you and (b) distribute
11
+ verbatim copies of these files to third parties. As a condition to the
12
+ foregoing grant, you must provide this notice along with each copy you
13
+ distribute and you must not remove, alter, or obscure this notice. All
14
+ other use, reproduction, modification, distribution, or other
15
+ exploitation of these files is strictly prohibited, except as may be set
16
+ forth in a separate written license agreement between you and Stratagem.
17
+ The terms of any such license agreement will control over this
18
+ notice. The license stated above will be automatically terminated and
19
+ revoked if you exceed its scope or violate any of the terms of this
20
+ notice.
21
+
22
+ Unless otherwise expressly agreed by StrataGem in a separate written
23
+ license agreement, these files are provided AS IS, WITHOUT WARRANTY OF
24
+ ANY KIND, including without any implied warranties of MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NON-INFRINGEMENT. As a
26
+ condition to your use of these files, you are solely responsible for
27
+ such use. StrataGem will have no liability to you for direct,
28
+ indirect, consequential, incidental, special, or punitive damages or
29
+ for lost profits or data.
data/Manifest CHANGED
@@ -1,3 +1,4 @@
1
+ LICENSE
1
2
  Manifest
2
3
  Rakefile
3
4
  bin/stratagem
@@ -38,44 +39,45 @@ lib/stratagem/extensions/object.rb
38
39
  lib/stratagem/extensions/red_parse.rb
39
40
  lib/stratagem/extensions/string.rb
40
41
  lib/stratagem/extensions/trace_compression.rb
41
- lib/stratagem/framework_extensions.rb
42
- lib/stratagem/framework_extensions/method_invocation.rb
43
- lib/stratagem/framework_extensions/models.rb
44
- lib/stratagem/framework_extensions/models/adapters/active_record/detect.rb
45
- lib/stratagem/framework_extensions/models/adapters/active_record/extensions.rb
46
- lib/stratagem/framework_extensions/models/adapters/active_record/metadata.rb
47
- lib/stratagem/framework_extensions/models/adapters/active_record/tracing.rb
48
- lib/stratagem/framework_extensions/models/adapters/authlogic/detect.rb
49
- lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb
50
- lib/stratagem/framework_extensions/models/adapters/authlogic/metadata.rb
51
- lib/stratagem/framework_extensions/models/adapters/authlogic/tracing.rb
52
- lib/stratagem/framework_extensions/models/adapters/common/detect.rb
53
- lib/stratagem/framework_extensions/models/adapters/common/extensions.rb
54
- lib/stratagem/framework_extensions/models/adapters/common/metadata.rb
55
- lib/stratagem/framework_extensions/models/adapters/common/tracing.rb
56
- lib/stratagem/framework_extensions/models/adapters/devise/detect.rb
57
- lib/stratagem/framework_extensions/models/adapters/devise/extensions.rb
58
- lib/stratagem/framework_extensions/models/adapters/devise/metadata.rb
59
- lib/stratagem/framework_extensions/models/adapters/devise/tracing.rb
60
- lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb
61
- lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb
62
- lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb
63
- lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb
64
- lib/stratagem/framework_extensions/models/adapters/restful_authentication/detect.rb
65
- lib/stratagem/framework_extensions/models/adapters/restful_authentication/extensions.rb
66
- lib/stratagem/framework_extensions/models/adapters/restful_authentication/metadata.rb
67
- lib/stratagem/framework_extensions/models/adapters/restful_authentication/tracing.rb
68
- lib/stratagem/framework_extensions/models/adapters/util/authentication_metadata.rb
69
- lib/stratagem/framework_extensions/models/annotations.rb
70
- lib/stratagem/framework_extensions/models/detect.rb
71
- lib/stratagem/framework_extensions/models/metadata.rb
72
- lib/stratagem/framework_extensions/models/mocking.rb
73
- lib/stratagem/framework_extensions/models/tracing.rb
74
- lib/stratagem/framework_extensions/rails.rb
75
- lib/stratagem/framework_extensions/rails2/action_controller.rb
76
- lib/stratagem/framework_extensions/rails2/action_mailer.rb
77
- lib/stratagem/framework_extensions/rails3/parameters.rb
78
- lib/stratagem/framework_extensions/request_forgery_protection.rb
42
+ lib/stratagem/instrumentation.rb
43
+ lib/stratagem/instrumentation/method_invocation.rb
44
+ lib/stratagem/instrumentation/models.rb
45
+ lib/stratagem/instrumentation/models/annotations.rb
46
+ lib/stratagem/instrumentation/models/association.rb
47
+ lib/stratagem/instrumentation/models/authentication.rb
48
+ lib/stratagem/instrumentation/models/authentication/authlogic/detect.rb
49
+ lib/stratagem/instrumentation/models/authentication/authlogic/instrumentation.rb
50
+ lib/stratagem/instrumentation/models/authentication/authlogic/metadata.rb
51
+ lib/stratagem/instrumentation/models/authentication/devise/detect.rb
52
+ lib/stratagem/instrumentation/models/authentication/devise/instrumentation.rb
53
+ lib/stratagem/instrumentation/models/authentication/devise/metadata.rb
54
+ lib/stratagem/instrumentation/models/authentication/metadata.rb
55
+ lib/stratagem/instrumentation/models/authentication/restful_authentication/detect.rb
56
+ lib/stratagem/instrumentation/models/authentication/restful_authentication/instrumentation.rb
57
+ lib/stratagem/instrumentation/models/authentication/restful_authentication/metadata.rb
58
+ lib/stratagem/instrumentation/models/detect.rb
59
+ lib/stratagem/instrumentation/models/metadata.rb
60
+ lib/stratagem/instrumentation/models/mocking.rb
61
+ lib/stratagem/instrumentation/models/persistence.rb
62
+ lib/stratagem/instrumentation/models/persistence/active_record/detect.rb
63
+ lib/stratagem/instrumentation/models/persistence/active_record/extensions.rb
64
+ lib/stratagem/instrumentation/models/persistence/active_record/metadata.rb
65
+ lib/stratagem/instrumentation/models/persistence/active_record/tracing.rb
66
+ lib/stratagem/instrumentation/models/persistence/common/detect.rb
67
+ lib/stratagem/instrumentation/models/persistence/common/extensions.rb
68
+ lib/stratagem/instrumentation/models/persistence/common/metadata.rb
69
+ lib/stratagem/instrumentation/models/persistence/common/tracing.rb
70
+ lib/stratagem/instrumentation/models/support_libraries.rb
71
+ lib/stratagem/instrumentation/models/support_libraries/friendly_id/detect.rb
72
+ lib/stratagem/instrumentation/models/support_libraries/friendly_id/metadata.rb
73
+ lib/stratagem/instrumentation/models/support_libraries/state_machine/detect.rb
74
+ lib/stratagem/instrumentation/models/support_libraries/state_machine/metadata.rb
75
+ lib/stratagem/instrumentation/models/tracing.rb
76
+ lib/stratagem/instrumentation/rails.rb
77
+ lib/stratagem/instrumentation/rails2/action_controller.rb
78
+ lib/stratagem/instrumentation/rails2/action_mailer.rb
79
+ lib/stratagem/instrumentation/rails3/parameters.rb
80
+ lib/stratagem/instrumentation/request_forgery_protection.rb
79
81
  lib/stratagem/interface/browser.rb
80
82
  lib/stratagem/interface/public/images/backgrounds/content.png
81
83
  lib/stratagem/interface/public/images/backgrounds/shadow.png
data/Rakefile CHANGED
@@ -2,9 +2,9 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('stratagem', '0.2.0') do |p|
6
- p.description = "Intuitive security analysis of your Rails applications"
7
- p.url = "http://github.com/stratagem/stratagem"
5
+ Echoe.new('stratagem', '0.2.2') do |p|
6
+ p.description = "Intuitive security analysis for your Rails applications"
7
+ p.url = "http://www.stratagemapp.com"
8
8
  p.author = "Charles Grimes"
9
9
  p.email = "cj@stratagemapp.com"
10
10
  p.executable_pattern = ['bin/*']
@@ -9,14 +9,14 @@ end
9
9
 
10
10
  module Stratagem
11
11
  class << self
12
- def init
12
+ def load_dependencies
13
13
  require 'haml'
14
14
  require 'launchy'
15
15
  require 'redparse'
16
16
  require 'stratagem/blocker'
17
17
  require 'stratagem/logger'
18
18
  require 'stratagem/extensions'
19
- require 'stratagem/framework_extensions'
19
+ require 'stratagem/instrumentation'
20
20
 
21
21
  require 'stratagem/model'
22
22
  require 'stratagem/auto_mock'
@@ -32,12 +32,29 @@ module Stratagem
32
32
  require 'stratagem/snapshot'
33
33
 
34
34
  require 'stratagem/commands'
35
-
35
+ end
36
+
37
+ def init
38
+ load_dependencies
39
+
36
40
  @@blocker = Blocker.new
37
41
  @@running = false
38
42
  @@session_id = Time.now.to_f.to_s # the interface uses this to determine which instance of the client it's talking to
39
43
  end
40
44
 
45
+ def ssl?
46
+ false
47
+ end
48
+
49
+ def domain
50
+ 'stratagemapp.local'
51
+ end
52
+
53
+ def mocking?
54
+ true
55
+ end
56
+
57
+
41
58
  def rails_version
42
59
  @@rails_version ||= begin
43
60
  rails_version = Rails.version.split('.').map {|v| v.size > 1 ? 9 : v.to_i }
@@ -63,9 +80,7 @@ module Stratagem
63
80
  Stratagem::Logger.instance
64
81
  end
65
82
 
66
- def domain
67
- ENV['STRATAGEM_HOST'] || 'stratagemapp.com'
68
- end
83
+
69
84
 
70
85
  def wait_for_completion
71
86
  @@blocker.wait
@@ -91,7 +106,7 @@ module Stratagem
91
106
  # # Print a flat profile to text
92
107
  # printer = RubyProf::FlatPrinter.new(result)
93
108
  # printer.print(STDOUT, 0)
94
- rescue
109
+ rescue Exception
95
110
  puts $!.message
96
111
  puts $!.backtrace
97
112
  ensure
@@ -28,7 +28,8 @@ module Stratagem
28
28
 
29
29
  def base_url
30
30
  subdomain = credentials ? credentials[:account] : 'www'
31
- "https://#{subdomain}.stratagemapp.com"
31
+ protocol = Stratagem.ssl? ? 'https' : 'http'
32
+ "#{protocol}://#{subdomain}.#{Stratagem.domain}"
32
33
  end
33
34
 
34
35
  def project_url
@@ -14,27 +14,41 @@ module Stratagem::AutoMock
14
14
  end
15
15
 
16
16
  def clear
17
- objects = self.repo.values.inject([]) {|memo,obj| memo += obj.compact }
18
- i = 0
19
- while (objects.size > 0 && ((i+=1) < objects.size))
20
- objects = objects.select do |instance|
21
- # puts "deleting #{instance.class.name}"
22
- begin
23
- instance.destroy
24
- rescue
17
+ if (Stratagem.mocking?)
18
+ objects = self.repo.values.inject([]) {|memo,obj| memo += obj.compact }
19
+ i = 0
20
+ while (objects.size > 0 && ((i+=1) < objects.size))
21
+ objects = objects.select do |instance|
22
+ next if (pre_existing_object_ids[instance.class] || []).include?(instance.id)
23
+ puts "deleting #{instance.class.name} - #{instance.id}"
25
24
  begin
26
- instance.delete
25
+ instance.destroy
27
26
  rescue
28
- puts "Unable to delete object: #{instance.class.name} - #{$!.message}"
29
- puts $!.backtrace
27
+ begin
28
+ instance.delete
29
+ rescue
30
+ puts "Unable to delete object: #{instance.class.name} - #{$!.message}"
31
+ puts $!.backtrace
32
+ end
30
33
  end
34
+ !instance.frozen?
31
35
  end
32
- !instance.frozen?
33
36
  end
34
37
  end
35
38
  self.repo.clear
36
39
  end
37
40
 
41
+ # def export
42
+ # h = {}
43
+ # repo.each {|model_klass,instances|
44
+ # h[model_klass.name] = instances.map {|instance|
45
+ # instance.stratagem.
46
+ # :database_attributes => instance.
47
+ # }
48
+ #
49
+ # }
50
+ # end
51
+ #
38
52
  def destroy
39
53
  clear
40
54
  end
@@ -52,23 +66,82 @@ module Stratagem::AutoMock
52
66
  instance
53
67
  end
54
68
 
69
+ def pre_existing_object_ids
70
+ @pre_existing_object_ids ||= {}
71
+ end
72
+
73
+ def load_existing_object_ids(klass)
74
+ if (Stratagem.mocking?)
75
+ # handle polymorphic objects (class may actually be a subclass of the klass parameter)
76
+ klass.existing_instance_ids.each do |existing_id|
77
+ begin
78
+ instance = klass.find(existing_id)
79
+ (pre_existing_object_ids[instance.class] ||= []) << existing_id
80
+ rescue
81
+ puts "ERROR: instance id #{existing_id} of #{klass.name} could not be loaded"
82
+ end
83
+ end
84
+ else
85
+ pre_existing_object_ids[klass] = []
86
+ end
87
+ end
88
+
89
+ def load_instance_ids(meta_model)
90
+ if (meta_model.stratagem?)
91
+ meta_model.klass.existing_instance_ids
92
+ else
93
+ []
94
+ end
95
+ end
96
+
97
+
55
98
  def fill(model_count=nil)
56
99
  Stratagem.logger.phase "mocking_models"
100
+
101
+ # load the ids of existing models for each class
102
+ application.models.each do |meta_model|
103
+ next unless meta_model.stratagem?
104
+ load_existing_object_ids(meta_model.klass)
105
+ end
106
+
107
+ # mock instances of all models
108
+ if (Stratagem.mocking?)
109
+ application.models.each do |meta_model|
110
+ mock_model(meta_model.klass, model_count) if (meta_model.stratagem?)
111
+ end
112
+ end
113
+
114
+ # determine the new ids for each model
57
115
  application.models.each do |meta_model|
58
- models = mock_model(meta_model.klass, model_count) if (meta_model.stratagem?)
116
+ next unless meta_model.klass
117
+ next unless meta_model.stratagem?
118
+
119
+ known_mocked_instances = mocked(meta_model.klass)
120
+ new_ids = load_instance_ids(meta_model) - (pre_existing_object_ids[meta_model.klass] || [])
121
+ repo[meta_model.klass.name] = new_ids.map {|id|
122
+ begin
123
+ known_mocked_instances.find {|i| i.id == id } || meta_model.klass.find(id)
124
+ rescue
125
+ puts "ERROR: #{$!.message}"
126
+ nil
127
+ end
128
+ }.compact
129
+
59
130
  end
60
- # puts "aquifer full"
131
+
61
132
  print
62
133
  self
63
134
  end
64
135
 
65
136
  def print
137
+ puts "Mocked models:"
66
138
  application.models.each do |meta_model|
67
139
  puts "#{meta_model.klass.name}"
68
140
  (repo[meta_model.klass.name] || []).each do |instance|
69
- puts "\t#{instance.class} - #{instance}"
141
+ puts "\t#{instance.class} - #{instance.id}"
70
142
  end
71
143
  end
144
+ puts "end of aquifer"
72
145
  end
73
146
 
74
147
  def mock_model(klass, count=nil)
@@ -18,7 +18,15 @@ module Stratagem::AutoMock
18
18
  object.stratagem.mock_attributes
19
19
  end
20
20
 
21
+ # Note:
22
+ # If a class is passed in that has descendants, a leaf descendant will be chosen at random
21
23
  def mock(model,mock_chain=[], belongs_to=nil)
24
+ while (model.stratagem.subclasses?)
25
+ prior_model = model
26
+ model = model.sg_subclasses[rand model.sg_subclasses.size]
27
+ puts "mapped base class #{prior_model.name} -> #{model.name} "
28
+ end
29
+
22
30
  return if mock_chain.select {|m| m == model }.size > 1
23
31
  mock_chain << model
24
32
 
@@ -39,11 +47,12 @@ module Stratagem::AutoMock
39
47
  break
40
48
  end
41
49
  end
42
- rescue
43
- puts $!.class.name
44
- puts $!.message
45
- puts $!.backtrace
46
- e = MockError.new("Unexpected error mocking model #{model.name}")
50
+ rescue Exception, ActiveRecord::ActiveRecordError
51
+ # puts $!.class.name
52
+ # puts $!.message
53
+ # puts $!.backtrace
54
+ e = MockError.new("Unexpected error mocking model #{model.name} - #{$!.message}")
55
+ puts e.message
47
56
  e.target = $!
48
57
  # raise e
49
58
  end
@@ -60,7 +69,7 @@ module Stratagem::AutoMock
60
69
  def mocked(model=nil)
61
70
  @mocked ||= {}
62
71
  if (model)
63
- @mocked[model.name] ||= []
72
+ @mocked[model.name] ||= model.all
64
73
  else
65
74
  @mocked
66
75
  end
@@ -109,26 +118,6 @@ module Stratagem::AutoMock
109
118
  end
110
119
  end
111
120
 
112
- # has_many relations
113
- # object.stratagem.relation_names(:has_many).each do |attr_name|
114
- # relation = object.stratagem.relation(attr_name)
115
- # # select the instances that don't have an existing belongs_to for this relation type
116
- # instances = mocked(relation.klass).select {|i|
117
- # br = i.stratagem.relations.find {|r| r.klass == i.class }
118
- # if (br && !i.send(br.name).nil?)
119
- # false
120
- # else
121
- # true
122
- # end
123
- # }
124
- # if (instances.size > 2)
125
- # collection = object.send(attr_name.to_s)
126
- # collection << instances[rand instances.size]
127
- # else
128
- # mock(relation.klass, mock_chain, object)
129
- # end
130
- # end
131
-
132
121
  (object.stratagem.invalid_columns(object)).size == 0
133
122
  end
134
123
 
@@ -163,11 +152,10 @@ module Stratagem::AutoMock
163
152
  puts "Error mocking #{klass.name}"
164
153
  valid = false
165
154
  rescue
166
- puts object.stratagem.mock_attributes.inspect
167
- puts "Error mocking #{object.class.name} - #{$!.message}"
155
+ puts "Error mocking #{object.class.name} - #{$!.message} - #{object.stratagem.mock_attributes.inspect}"
168
156
  error_column = object.stratagem.column_from_error($!)
169
- puts "\terror column: #{error_column}"
170
157
  if error_column && !object.stratagem.foreign_keys.include?(error_column)
158
+ puts "\terror column: #{error_column}"
171
159
  if retries < 100
172
160
  puts "\tretrying to correct field #{error_column} that was missing validation"
173
161
  set_attribute_value(object, error_column, [])
@@ -179,7 +167,8 @@ module Stratagem::AutoMock
179
167
  else
180
168
  valid = false
181
169
  end
182
- puts $!.backtrace unless valid
170
+ puts "\tERROR: could not correct errors in model" unless valid
171
+ # puts $!.backtrace unless valid
183
172
  end
184
173
 
185
174
  # puts "\t#{object.stratagem.mock_attributes.inspect}" if (valid)
@@ -57,7 +57,9 @@ module Stratagem::AutoMock
57
57
 
58
58
  def generate_string(attribute_name)
59
59
  attribute_name = attribute_name.to_s
60
- if (attribute_name.stratagem_contains_token?('email') || attribute_name.stratagem_contains_token?('e-mail'))
60
+ if (attribute_name.stratagem_contains_token?('_type'))
61
+ nil
62
+ elsif (attribute_name.stratagem_contains_token?('email') || attribute_name.stratagem_contains_token?('e-mail'))
61
63
  (random_noise(4,false) || '') + @user[:email]
62
64
  elsif (attribute_name.stratagem_contains_token?('login') || attribute_name.stratagem_contains_token?('username') || attribute_name.stratagem_contains_token?('user_name'))
63
65
  @user[:login] + (random_noise(4, false) || '')