stratagem 0.2.0 → 0.2.2

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 (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) || '')