blamestamp 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +137 -0
  3. data/Rakefile +38 -0
  4. data/lib/blamestamp/action_controller.rb +24 -0
  5. data/lib/blamestamp/active_record.rb +84 -0
  6. data/lib/blamestamp/schema.rb +37 -0
  7. data/lib/blamestamp/version.rb +3 -0
  8. data/lib/blamestamp.rb +26 -0
  9. data/lib/tasks/blamestamp_tasks.rake +4 -0
  10. data/test/alligators_controller_test.rb +60 -0
  11. data/test/blameable_test.rb +114 -0
  12. data/test/blamestamp_test.rb +7 -0
  13. data/test/devise_works_test.rb +20 -0
  14. data/test/dummy/README.rdoc +261 -0
  15. data/test/dummy/Rakefile +7 -0
  16. data/test/dummy/app/assets/javascripts/application.js +13 -0
  17. data/test/dummy/app/assets/javascripts/home.js +2 -0
  18. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  19. data/test/dummy/app/assets/stylesheets/home.css +4 -0
  20. data/test/dummy/app/controllers/alligators_controller.rb +83 -0
  21. data/test/dummy/app/controllers/application_controller.rb +3 -0
  22. data/test/dummy/app/controllers/flags_controller.rb +83 -0
  23. data/test/dummy/app/controllers/home_controller.rb +4 -0
  24. data/test/dummy/app/controllers/projects_controller.rb +83 -0
  25. data/test/dummy/app/helpers/alligators_helper.rb +2 -0
  26. data/test/dummy/app/helpers/application_helper.rb +2 -0
  27. data/test/dummy/app/helpers/flags_helper.rb +2 -0
  28. data/test/dummy/app/helpers/home_helper.rb +2 -0
  29. data/test/dummy/app/helpers/projects_helper.rb +2 -0
  30. data/test/dummy/app/models/alligator.rb +6 -0
  31. data/test/dummy/app/models/flag.rb +12 -0
  32. data/test/dummy/app/models/project.rb +6 -0
  33. data/test/dummy/app/models/user.rb +10 -0
  34. data/test/dummy/app/views/alligators/_form.html.erb +17 -0
  35. data/test/dummy/app/views/alligators/edit.html.erb +6 -0
  36. data/test/dummy/app/views/alligators/index.html.erb +21 -0
  37. data/test/dummy/app/views/alligators/new.html.erb +5 -0
  38. data/test/dummy/app/views/alligators/show.html.erb +5 -0
  39. data/test/dummy/app/views/devise/_links.erb +25 -0
  40. data/test/dummy/app/views/devise/confirmations/new.html.erb +12 -0
  41. data/test/dummy/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  42. data/test/dummy/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  43. data/test/dummy/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  44. data/test/dummy/app/views/devise/passwords/edit.html.erb +16 -0
  45. data/test/dummy/app/views/devise/passwords/new.html.erb +12 -0
  46. data/test/dummy/app/views/devise/registrations/edit.html.erb +25 -0
  47. data/test/dummy/app/views/devise/registrations/new.html.erb +18 -0
  48. data/test/dummy/app/views/devise/sessions/new.html.erb +17 -0
  49. data/test/dummy/app/views/devise/unlocks/new.html.erb +12 -0
  50. data/test/dummy/app/views/flags/_form.html.erb +17 -0
  51. data/test/dummy/app/views/flags/edit.html.erb +6 -0
  52. data/test/dummy/app/views/flags/index.html.erb +21 -0
  53. data/test/dummy/app/views/flags/new.html.erb +5 -0
  54. data/test/dummy/app/views/flags/show.html.erb +5 -0
  55. data/test/dummy/app/views/home/index.html.erb +8 -0
  56. data/test/dummy/app/views/layouts/application.html.erb +17 -0
  57. data/test/dummy/app/views/projects/_form.html.erb +17 -0
  58. data/test/dummy/app/views/projects/edit.html.erb +6 -0
  59. data/test/dummy/app/views/projects/index.html.erb +21 -0
  60. data/test/dummy/app/views/projects/new.html.erb +5 -0
  61. data/test/dummy/app/views/projects/show.html.erb +5 -0
  62. data/test/dummy/config/application.rb +57 -0
  63. data/test/dummy/config/boot.rb +10 -0
  64. data/test/dummy/config/database.yml +25 -0
  65. data/test/dummy/config/environment.rb +5 -0
  66. data/test/dummy/config/environments/development.rb +37 -0
  67. data/test/dummy/config/environments/production.rb +67 -0
  68. data/test/dummy/config/environments/test.rb +38 -0
  69. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  70. data/test/dummy/config/initializers/devise.rb +223 -0
  71. data/test/dummy/config/initializers/inflections.rb +15 -0
  72. data/test/dummy/config/initializers/mime_types.rb +5 -0
  73. data/test/dummy/config/initializers/secret_token.rb +7 -0
  74. data/test/dummy/config/initializers/session_store.rb +8 -0
  75. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  76. data/test/dummy/config/locales/devise.en.yml +57 -0
  77. data/test/dummy/config/locales/en.yml +5 -0
  78. data/test/dummy/config/routes.rb +14 -0
  79. data/test/dummy/config.ru +4 -0
  80. data/test/dummy/db/development.sqlite3 +0 -0
  81. data/test/dummy/db/migrate/20120420004117_devise_create_users.rb +49 -0
  82. data/test/dummy/db/migrate/20120420005606_create_projects.rb +10 -0
  83. data/test/dummy/db/migrate/20120504022124_create_alligators.rb +11 -0
  84. data/test/dummy/db/migrate/20120504025050_create_flags.rb +15 -0
  85. data/test/dummy/db/schema.rb +62 -0
  86. data/test/dummy/db/test.sqlite3 +0 -0
  87. data/test/dummy/log/development.log +780 -0
  88. data/test/dummy/log/test.log +32640 -0
  89. data/test/dummy/public/404.html +26 -0
  90. data/test/dummy/public/422.html +26 -0
  91. data/test/dummy/public/500.html +25 -0
  92. data/test/dummy/public/favicon.ico +0 -0
  93. data/test/dummy/script/rails +6 -0
  94. data/test/fixtures/alligators.yml +9 -0
  95. data/test/fixtures/flags.yml +12 -0
  96. data/test/fixtures/projects.yml +9 -0
  97. data/test/fixtures/users.yml +6 -0
  98. data/test/flags_controller_test.rb +72 -0
  99. data/test/migration_test.rb +24 -0
  100. data/test/projects_controller_test.rb +65 -0
  101. data/test/test_helper.rb +23 -0
  102. metadata +318 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 Ryan Cavis
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,137 @@
1
+ Blamestamp
2
+ =========
3
+
4
+ Blamestamp is intended as an easy way to record the creating and latest-editing user for an Active Record. It works similarly to the built-in Active Record timestamps module, but in a more configurable and predictable manner. Column names are configurable, as are default values, in case you allow non logged-in users to edit some things. Additionally, it allows configuration of when editing a record will update the blamestamps on a related record.
5
+
6
+
7
+ Requirements
8
+ ------------
9
+
10
+ ### Ruby and Rails
11
+
12
+ Requires Ruby version **>= 1.9.2** and Rails version **>= 3.0**
13
+
14
+ ### Current version limitations
15
+
16
+ Currently only works with a combination of Devise, ActiveRecord and ActiveController.
17
+
18
+
19
+ Installation
20
+ ------------
21
+
22
+ Blamestamp should be installed as a gem in your app. Currently, it is only available as the latest-build on github. Fixed versions forth-coming.
23
+
24
+ Include the gem in your Gemfile:
25
+
26
+ gem "blamestamp", :git => "https://github.com/cavis/blamestamp"
27
+
28
+
29
+ Getting Started
30
+ ---------------
31
+
32
+ ### In your migrations:
33
+
34
+ class CreateFoos < ActiveRecord::Migration
35
+ def change
36
+ create_table :foos do |t|
37
+ t.string :bar
38
+ t.blamestamps
39
+ end
40
+ end
41
+ end
42
+
43
+ Or, if modifying an existing model:
44
+
45
+ class AddBlamestampsToFoos < ActiveRecord::Migration
46
+ def up
47
+ change_table :foos do |t|
48
+ t.blamestamps
49
+ end
50
+ end
51
+ def down
52
+ drop_blamestamps :foos
53
+ end
54
+ end
55
+
56
+
57
+ ### In your model:
58
+
59
+ class Foo < ActiveRecord::Base
60
+ blameable
61
+ end
62
+
63
+
64
+ Usage
65
+ -----
66
+
67
+ By default, blamestamps adds 4 columns to your models:
68
+
69
+ * `blame_cre_at`
70
+ * `blame_upd_at`
71
+ * `blame_cre_by`
72
+ * `blame_upd_by`
73
+
74
+ When a record is created, `blame_cre_at` and `blame_cre_by` will be set. If no remote-user is logged in (via a controller), `blame_cre_by` will be nil. On initial creation, both `blame_upd_at` and `blame_upd_by` will be nil.
75
+
76
+ When a record is updated for the first time (and every time after), `blame_upd_at` and `blame_upd_by` are modified. Again, `blame_upd_by` will remain nil if there is no remote-user.
77
+
78
+ Additionally, `blameable` adds 2 relations to your models:
79
+
80
+ * `blame_cre_user`
81
+ * `blame_upd_user`
82
+
83
+ These are standard `belongs_to` associations, and will be nil unless the `_at` column is populated.
84
+
85
+
86
+ Advanced Options
87
+ ----------------
88
+
89
+ If that's not enough for you, there are several advanced config options available.
90
+
91
+ ### In your migrations:
92
+
93
+ If you don't like the `blame` prefix on the columns, you can change it. In this example it will create columns `blah_cre_at`, `blah_upd_at`, `blah_cre_by`, and `blah_upd_by`.
94
+
95
+ t.blamestamps :prefix => :blah
96
+
97
+ ### In your model:
98
+
99
+ If you changed the prefix of the columns in your migration, you should let the model know about that too:
100
+
101
+ blameable :prefix => :blah
102
+
103
+ Or, if you picked something completely off-the-wall in your migration, you can specify each of the 4 columns individually:
104
+
105
+ blameable :cre_at => :made_at, :upd_at => :changed_at, :cre_by => :invented_by, :upd_by => :hacked_by
106
+
107
+ And if you don't like the default association names, you can define those too:
108
+
109
+ blameable :cre_user => :inventor, :upd_user => :hacker
110
+
111
+ Finally, you can cascade modifications from a `blameable` model to one of its associations. Whenever a record of the `blameable` class is inserted, updated, or deleted, the `upd_at`/`upd_by` columns on the associated record will be updated. For example:
112
+
113
+ class Foo < ActiveRecord::Base
114
+ belongs_to :bar
115
+ belongs_to :project
116
+ blameable :cascade => [:project, :bar]
117
+ end
118
+
119
+ Or, just specify a single cascade:
120
+
121
+ class Foo < ActiveRecord::Base
122
+ belongs_to :bar
123
+ belongs_to :project
124
+ blameable :cascade => :bar
125
+ end
126
+
127
+
128
+ Issues and Contributing
129
+ -----------------------
130
+
131
+ Please, let me know about any bugs/feature-requests via the issues tracker. And if you'd like to contribute, send me a note! Thanks.
132
+
133
+
134
+ License
135
+ -------
136
+
137
+ Blamestamp is free software, and may be redistributed under the MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'Blamestamp'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+
24
+
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
28
+ require 'rake/testtask'
29
+
30
+ Rake::TestTask.new(:test) do |t|
31
+ t.libs << 'lib'
32
+ t.libs << 'test'
33
+ t.pattern = 'test/**/*_test.rb'
34
+ t.verbose = false
35
+ end
36
+
37
+
38
+ task :default => :test
@@ -0,0 +1,24 @@
1
+ require 'action_controller'
2
+
3
+ module Blamestamp
4
+ module Blamer
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ self.before_filter :set_blamer
9
+ self.after_filter :unset_blamer
10
+ end
11
+
12
+ def set_blamer
13
+ if user_signed_in?
14
+ Blamestamp::set_blame_user(current_user.id)
15
+ end
16
+ end
17
+
18
+ def unset_blamer
19
+ Blamestamp::unset_blame_user()
20
+ end
21
+ end
22
+ end
23
+
24
+ ActionController::Base.send :include, Blamestamp::Blamer
@@ -0,0 +1,84 @@
1
+ require 'active_record'
2
+
3
+ module Blamestamp
4
+ module Blameable
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def blameable(options = {})
9
+ c = options_to_config(options)
10
+ class_attribute :blameable_config
11
+ self.blameable_config = c
12
+
13
+ # associations
14
+ self.belongs_to c[:cre_user], :class_name => c[:class], :foreign_key => c[:cre_by]
15
+ self.belongs_to c[:upd_user], :class_name => c[:class], :foreign_key => c[:upd_by]
16
+
17
+ # callbacks
18
+ self.before_create :blame_create
19
+ self.before_update :blame_update
20
+ self.after_destroy :blame_destroy
21
+ end
22
+
23
+ private
24
+
25
+ def options_to_config(opts)
26
+ prefix = opts[:prefix] || "blame"
27
+ cfg = {
28
+ :cre_at => opts[:cre_at] || "#{prefix}_cre_at".to_sym,
29
+ :upd_at => opts[:upd_at] || "#{prefix}_upd_at".to_sym,
30
+ :cre_by => opts[:cre_by] || "#{prefix}_cre_by".to_sym,
31
+ :upd_by => opts[:upd_by] || "#{prefix}_upd_by".to_sym,
32
+ :cre_user => opts[:cre_user] || "#{prefix}_cre_user".to_sym,
33
+ :upd_user => opts[:upd_user] || "#{prefix}_upd_user".to_sym,
34
+ :class => opts[:class] || "User".to_sym,
35
+ :cascade => opts[:cascade] || [],
36
+ }
37
+ cfg[:cascade] = [cfg[:cascade]] if !cfg[:cascade].kind_of?(Array)
38
+ return cfg
39
+ end
40
+ end
41
+
42
+ # main blamer workhorse
43
+ def blame_them!(at_key, by_key, force=false)
44
+ at_col = self.blameable_config[at_key]
45
+ by_col = self.blameable_config[by_key]
46
+
47
+ # only blame if it wasn't explicitly set
48
+ if force || !(self.changed - [at_col.to_s, by_col.to_s]).empty?
49
+ self[at_col] = Time.now
50
+ self[by_col] = Blamestamp::get_blame_user
51
+ return true
52
+ end
53
+
54
+ return false # nothing saved!
55
+ end
56
+
57
+ # cascade the blame up
58
+ def cascade_blame
59
+ self.blameable_config[:cascade].each do |assoc|
60
+ if self.send(assoc)
61
+ self.send(assoc).blame_them!(:upd_at, :upd_by, true)
62
+ self.send(assoc).save :validate => false
63
+ end
64
+ end
65
+ end
66
+
67
+ # create callback
68
+ def blame_create
69
+ self.cascade_blame() if self.blame_them!(:cre_at, :cre_by)
70
+ end
71
+
72
+ # update callback
73
+ def blame_update
74
+ self.cascade_blame() if self.blame_them!(:upd_at, :upd_by)
75
+ end
76
+
77
+ # destory callback
78
+ def blame_destroy
79
+ self.cascade_blame()
80
+ end
81
+ end
82
+ end
83
+
84
+ ActiveRecord::Base.send :include, Blamestamp::Blameable
@@ -0,0 +1,37 @@
1
+ module Blamestamp
2
+ module Schema
3
+ extend ActiveSupport::Concern
4
+
5
+ def blamestamps(options = {})
6
+ flds = options_to_fields(options)
7
+ column(flds[0], :datetime)
8
+ column(flds[1], :datetime)
9
+ column(flds[2], :integer)
10
+ column(flds[3], :integer)
11
+ end
12
+
13
+ def drop_blamestamps(tbl_name, options = {})
14
+ flds = options_to_fields(options)
15
+ remove_column tbl_name, :blame_cre_at
16
+ remove_column tbl_name, :blame_upd_at
17
+ remove_column tbl_name, :blame_cre_by
18
+ remove_column tbl_name, :blame_upd_by
19
+ end
20
+
21
+ private
22
+
23
+ def options_to_fields(opts)
24
+ prefix = opts[:prefix] || 'blame'
25
+ cre_at_fld = opts[:cre_at] || "#{prefix}_cre_at"
26
+ upd_at_fld = opts[:upd_at] || "#{prefix}_upd_at"
27
+ cre_by_fld = opts[:cre_by] || "#{prefix}_cre_by"
28
+ upd_by_fld = opts[:upd_by] || "#{prefix}_upd_by"
29
+ return [cre_at_fld, upd_at_fld, cre_by_fld, upd_by_fld]
30
+ end
31
+ end
32
+ end
33
+
34
+ # include 3 times, so all variations migrations work
35
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:include, Blamestamp::Schema)
36
+ ActiveRecord::ConnectionAdapters::Table.send(:include, Blamestamp::Schema)
37
+ ActiveRecord::ConnectionAdapters::TableDefinition.send(:include, Blamestamp::Schema)
@@ -0,0 +1,3 @@
1
+ module Blamestamp
2
+ VERSION = "0.9.0"
3
+ end
data/lib/blamestamp.rb ADDED
@@ -0,0 +1,26 @@
1
+ module Blamestamp
2
+ def self.set_blame_user(id)
3
+ Thread.current[:blamer_id] = id
4
+ end
5
+ def self.get_blame_user
6
+ return Thread.current[:blamer_id]
7
+ end
8
+ def self.unset_blame_user
9
+ Thread.current[:blamer_id] = nil
10
+ end
11
+ end
12
+
13
+ # activerecord "blameable"
14
+ if defined?(ActiveRecord)
15
+ require 'blamestamp/active_record'
16
+ require 'blamestamp/schema'
17
+ else
18
+ raise "blamestamp only works with active_record"
19
+ end
20
+
21
+ # actioncontroller "blamer"
22
+ if defined?(ActionController)
23
+ require 'blamestamp/action_controller'
24
+ else
25
+ raise "blamestamp only works with action_controller"
26
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :blamestamp do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,60 @@
1
+ require 'test_helper'
2
+
3
+ class AlligatorsControllerTest < ActionController::TestCase
4
+ test "stamps on create" do
5
+ sign_in :user, users(:harold)
6
+ create_alligator("foo", projects(:secret))
7
+
8
+ assert_not_nil @alligator.gator_cre_at, "created_at not set"
9
+ assert_equal users(:harold).id, @alligator.gator_cre_by, "created_by not set"
10
+ assert_nil @alligator.gator_upd_at, "updated_at was set"
11
+ assert_nil @alligator.gator_upd_by, "updated_by was set"
12
+
13
+ assert_nil @alligator.project.blame_cre_at, "project created_at was set"
14
+ assert_nil @alligator.project.blame_cre_by, "project created_by was set"
15
+ assert_not_nil @alligator.project.blame_upd_at, "project updated_at not set"
16
+ assert_equal users(:harold).id, @alligator.project.blame_upd_by, "project updated_by not set"
17
+ end
18
+
19
+ test "stamps on update" do
20
+ sign_in :user, users(:isak)
21
+ update_alligator(alligators(:james), "foo")
22
+
23
+ assert_not_nil @alligator.gator_upd_at, "updated_at not set"
24
+ assert_equal users(:isak).id, @alligator.gator_upd_by, "updated_by not set"
25
+
26
+ assert_not_nil @alligator.project.blame_upd_at, "project updated_at not set"
27
+ assert_equal users(:isak).id, @alligator.project.blame_upd_by, "project updated_by not set"
28
+ end
29
+
30
+ test "stamps on destroy" do
31
+ sign_in :user, users(:cameron)
32
+ destroy_alligator(alligators(:james))
33
+ prj = Project.find(projects(:secret).id)
34
+
35
+ assert_not_nil prj.blame_upd_at, "project updated_at not set"
36
+ assert_equal users(:cameron).id, prj.blame_upd_by, "project updated_by not set"
37
+ end
38
+
39
+ private
40
+
41
+ # helper to create and set a new alligator
42
+ def create_alligator(name, project)
43
+ post :create, :alligator => {:name => name, :project_id => project.id}
44
+ assert_response :redirect, "create didn't redirect"
45
+ @alligator = assigns(:alligator)
46
+ end
47
+
48
+ # helper to update and set an existing alligator
49
+ def update_alligator(gat, name)
50
+ put :update, :id => gat.id, :alligator => {:name => name}
51
+ assert_response :redirect, "update didn't redirect"
52
+ @alligator = assigns(:alligator)
53
+ end
54
+
55
+ # helper to destroy an alligator
56
+ def destroy_alligator(gat)
57
+ put :destroy, :id => gat.id
58
+ assert_response :redirect, "destroy didn't redirect"
59
+ end
60
+ end
@@ -0,0 +1,114 @@
1
+ require 'test_helper'
2
+
3
+ class BlameableTest < ActiveSupport::TestCase
4
+ test "default options" do
5
+ assocs = Project.reflect_on_all_associations.collect {|a| a.name }
6
+ assert assocs.include?(:blame_cre_user), "doesn't include cre_user"
7
+ assert assocs.include?(:blame_upd_user), "doesn't include upd_user"
8
+
9
+ p = projects(:secret)
10
+ set_blamers(p, users(:harold), users(:isak))
11
+ assert_equal users(:harold).email, p.blame_cre_user.email, "incorrect cre_user"
12
+ assert_equal users(:isak).email, p.blame_upd_user.email, "incorrect upd_user"
13
+ end
14
+
15
+ test "prefix option" do
16
+ assocs = Alligator.reflect_on_all_associations.collect {|a| a.name }
17
+ assert assocs.include?(:gator_cre_user), "doesn't include cre_user"
18
+ assert assocs.include?(:gator_upd_user), "doesn't include upd_user"
19
+
20
+ a = alligators(:james)
21
+ set_blamers(a, users(:harold), users(:isak))
22
+ assert_equal users(:harold).email, a.gator_cre_user.email, "incorrect cre_user"
23
+ assert_equal users(:isak).email, a.gator_upd_user.email, "incorrect upd_user"
24
+ end
25
+
26
+ test "non array cascade option" do
27
+ a = alligators(:james)
28
+ assert_nil a.project.blame_cre_user, "project already blame-created"
29
+ assert_nil a.project.blame_upd_user, "project already blame-updated"
30
+
31
+ set_blamers(a, users(:isak), users(:isak))
32
+
33
+ assert_nil a.project.blame_cre_user, "project was blame-created"
34
+ assert_not_nil a.project.blame_upd_user, "project not blame-updated"
35
+ assert_equal users(:isak).email, a.project.blame_upd_user.email, "incorrect upd_user"
36
+ end
37
+
38
+ test "array cascade option" do
39
+ f = flags(:american)
40
+ assert_nil f.project.blame_cre_user, "project already blame-created"
41
+ assert_nil f.project.blame_upd_user, "project already blame-updated"
42
+ assert_nil f.alligator.gator_cre_user, "gator already blame-created"
43
+ assert_nil f.alligator.gator_upd_user, "gator already blame-updated"
44
+
45
+ set_blamers(f, users(:harold), users(:harold))
46
+
47
+ assert_nil f.project.blame_cre_user, "project was blame-created"
48
+ assert_not_nil f.project.blame_upd_user, "project not blame-updated"
49
+ assert_equal users(:harold).email, f.project.blame_upd_user.email, "incorrect upd_user"
50
+ assert_nil f.alligator.gator_cre_user, "gator was blame-created"
51
+ assert_not_nil f.alligator.gator_upd_user, "gator not blame-updated"
52
+ assert_equal users(:harold).email, f.alligator.gator_upd_user.email, "incorrect upd_user"
53
+ end
54
+
55
+ test "cre_at option" do
56
+ f = Flag.new(:origin => 'aoeu')
57
+ assert_nil f.made_at, "already has cre_at"
58
+ f.save()
59
+ assert_not_nil f.made_at, "didn't set cre_at"
60
+ end
61
+
62
+ test "upd_at option" do
63
+ f = flags(:semaphore)
64
+ f.origin = "something else"
65
+ assert_nil f.changed_at, "already has upd_at"
66
+ f.save()
67
+ assert_not_nil f.changed_at, "didn't set upd_at"
68
+ end
69
+
70
+ test "cre_by option" do
71
+ f = Flag.new(:origin => 'aoeu')
72
+ assert_nil f.made_by, "already has cre_by"
73
+ f.save()
74
+ assert_not_nil f.made_by, "didn't set cre_by"
75
+ end
76
+
77
+ test "upd_by option" do
78
+ f = flags(:semaphore)
79
+ f.origin = "something else"
80
+ assert_nil f.hacked_by, "already has upd_by"
81
+ f.save()
82
+ assert_not_nil f.hacked_by, "didn't set upd_by"
83
+ end
84
+
85
+ test "cre_user option" do
86
+ assocs = Flag.reflect_on_all_associations.collect {|f| f.name }
87
+ assert assocs.include?(:maker), "doesn't include cre_user"
88
+
89
+ f = flags(:semaphore)
90
+ set_blamers(f, users(:cameron), users(:cameron))
91
+ assert_equal users(:cameron).email, f.maker.email, "incorrect cre_user"
92
+ end
93
+
94
+ test "upd_user option" do
95
+ assocs = Flag.reflect_on_all_associations.collect {|f| f.name }
96
+ assert assocs.include?(:hacker), "doesn't include upd_user"
97
+
98
+ f = flags(:semaphore)
99
+ set_blamers(f, users(:cameron), users(:cameron))
100
+ assert_equal users(:cameron).email, f.hacker.email, "incorrect upd_user"
101
+ end
102
+
103
+ private
104
+
105
+ def set_blamers(rec, cre_user, upd_user)
106
+ Blamestamp::set_blame_user(cre_user.id)
107
+ rec.blame_them!(:cre_at, :cre_by, true)
108
+ rec.cascade_blame
109
+ Blamestamp::set_blame_user(upd_user.id)
110
+ rec.blame_them!(:upd_at, :upd_by, true)
111
+ rec.cascade_blame
112
+ end
113
+
114
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class BlamestampTest < ActiveSupport::TestCase
4
+ test "exists" do
5
+ assert_kind_of Module, Blamestamp, "blamestamp isn't what it seems to be"
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+
3
+ class DeviseWorksTest < ActionController::TestCase
4
+ setup do
5
+ @controller = HomeController.new
6
+ end
7
+
8
+ test "logged out" do
9
+ get :index
10
+ assert_response :success
11
+ assert_select "#loggedout"
12
+ end
13
+
14
+ test "login" do
15
+ sign_in :user, users(:harold)
16
+ get :index
17
+ assert_response :success
18
+ assert_select "#loggedin"
19
+ end
20
+ end