samsara 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +16 -0
  3. data/.travis.yml +12 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +33 -0
  7. data/Rakefile +8 -0
  8. data/lib/samsara/context.rb +7 -0
  9. data/lib/samsara/context_concern.rb +31 -0
  10. data/lib/samsara/controller.rb +37 -0
  11. data/lib/samsara/http_request.rb +32 -0
  12. data/lib/samsara/model.rb +43 -0
  13. data/lib/samsara/railtie.rb +13 -0
  14. data/lib/samsara/revision.rb +7 -0
  15. data/lib/samsara/revision_concern.rb +30 -0
  16. data/lib/samsara/serializer.rb +29 -0
  17. data/lib/samsara/version.rb +3 -0
  18. data/lib/samsara.rb +90 -0
  19. data/samsara.gemspec +32 -0
  20. data/spec/context_spec.rb +42 -0
  21. data/spec/controller_spec.rb +122 -0
  22. data/spec/dummy/.rspec +2 -0
  23. data/spec/dummy/README.rdoc +28 -0
  24. data/spec/dummy/Rakefile +6 -0
  25. data/spec/dummy/app/assets/images/.keep +0 -0
  26. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  27. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  28. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  29. data/spec/dummy/app/controllers/celebrities_controller.rb +30 -0
  30. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  31. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  32. data/spec/dummy/app/mailers/.keep +0 -0
  33. data/spec/dummy/app/models/.keep +0 -0
  34. data/spec/dummy/app/models/celebrity.rb +5 -0
  35. data/spec/dummy/app/models/concerns/.keep +0 -0
  36. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  37. data/spec/dummy/bin/bundle +3 -0
  38. data/spec/dummy/bin/rails +4 -0
  39. data/spec/dummy/bin/rake +4 -0
  40. data/spec/dummy/bin/setup +29 -0
  41. data/spec/dummy/config/application.rb +32 -0
  42. data/spec/dummy/config/boot.rb +5 -0
  43. data/spec/dummy/config/database.yml +25 -0
  44. data/spec/dummy/config/environment.rb +5 -0
  45. data/spec/dummy/config/environments/development.rb +41 -0
  46. data/spec/dummy/config/environments/production.rb +79 -0
  47. data/spec/dummy/config/environments/test.rb +42 -0
  48. data/spec/dummy/config/initializers/assets.rb +11 -0
  49. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  50. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  51. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  52. data/spec/dummy/config/initializers/inflections.rb +16 -0
  53. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  54. data/spec/dummy/config/initializers/session_store.rb +3 -0
  55. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  56. data/spec/dummy/config/locales/en.yml +23 -0
  57. data/spec/dummy/config/routes.rb +5 -0
  58. data/spec/dummy/config/secrets.yml +22 -0
  59. data/spec/dummy/config.ru +4 -0
  60. data/spec/dummy/db/migrate/20150223145759_create_test_tables.rb +30 -0
  61. data/spec/dummy/db/schema.rb +45 -0
  62. data/spec/dummy/lib/assets/.keep +0 -0
  63. data/spec/dummy/log/.keep +0 -0
  64. data/spec/dummy/log/development.log +0 -0
  65. data/spec/dummy/public/404.html +67 -0
  66. data/spec/dummy/public/422.html +67 -0
  67. data/spec/dummy/public/500.html +66 -0
  68. data/spec/dummy/public/favicon.ico +0 -0
  69. data/spec/model_spec.rb +219 -0
  70. data/spec/rails_helper.rb +51 -0
  71. data/spec/revision_spec.rb +64 -0
  72. data/spec/serializer_spec.rb +41 -0
  73. data/spec/spec_helper.rb +90 -0
  74. metadata +257 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZTg2NTcwOGUzYzc2ZGVlNjM3MmMyZTM3NmNmY2Y3YzVmNWVjMzk2NA==
5
+ data.tar.gz: !binary |-
6
+ YWFhMGZhY2RiYzJjODhhMWU3MTEwNWNjNmQ2OTNlNmEyYmVmNTVhNQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ N2QyNzMwZjIxMTU2YTY0YjNhZDI3MGZjMTJhNTY2NTA1MDU0ZDc0Y2MxZmE0
10
+ OGI4ZTJlYzMyODg2NjU5MzdjZGQ4Y2UyNzZkODA4NDM5YmViMjE2MTYyNTdm
11
+ ZDU3NTQyNzFjNDgwODIxMjFmYzZkNGJmZjdlM2YxZDY5ZjBjMmE=
12
+ data.tar.gz: !binary |-
13
+ OGEyZWQ2Njc0MjY5OGY5MmZmOTc4YzBhM2E5OGRiMDJmZWUyNTdlNTM1MjZi
14
+ ZDRmOWNjYjViYzEwZWIzNTk5MzhjZWE2OTUyODM0NGI0OTg5NzMzZjIwOGNj
15
+ OGY4NTc3NWE1YmM1OThlZjBjODcyYmM1ZjZmM2ZiMGIzYzk2M2Y=
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ spec/dummy/log/*
16
+ spec/dummy/db/test.sqlite3
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.1.1
6
+ - 2.1.2
7
+ - 2.1.3
8
+ - 2.2.0
9
+
10
+ addons:
11
+ code_climate:
12
+ repo_token: 749cbdcad311874703e4581c7c3504d5e1cefe2d81ed61506018f546f458e219
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in samsara.gemspec
4
+ gemspec
5
+
6
+ gem "codeclimate-test-reporter", group: :test, require: nil
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Tom Nijmeijer
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # Samsara
2
+ [![Build Status](https://travis-ci.org/nedap/samsara.svg?branch=master)](http://travis-ci.org/nedap/samsara)
3
+ [![Code Climate](https://codeclimate.com/repos/55377484e30ba0452a000e20/badges/4a99ca136302edade535/gpa.svg)](https://codeclimate.com/repos/55377484e30ba0452a000e20/feed)
4
+ [![Test Coverage](https://codeclimate.com/repos/55377484e30ba0452a000e20/badges/4a99ca136302edade535/coverage.svg)](https://codeclimate.com/repos/55377484e30ba0452a000e20/feed)
5
+
6
+ A simple auditing gem that does things a little differently. Rather than just storing the domain changes made
7
+ this gem is also capable of storing the context in which the changes were made such as a http request. This
8
+ context is stored in a separate database table and is shared by multiple revisions in case a single request
9
+ causes changes to multiple domain models.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ ```ruby
16
+ gem 'samsara'
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install samsara
26
+
27
+ ## Contributing
28
+
29
+ 1. Fork it ( https://github.com/nedap/samsara/fork )
30
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
31
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
32
+ 4. Push to the branch (`git push origin my-new-feature`)
33
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ desc 'Run the spec testing suite'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ desc 'Default: run the test suite'
8
+ task :default => [:spec]
@@ -0,0 +1,7 @@
1
+ require 'active_record'
2
+
3
+ class Samsara::Context < ActiveRecord::Base
4
+
5
+ include Samsara::ContextConcern
6
+
7
+ end
@@ -0,0 +1,31 @@
1
+ require 'active_support/concern'
2
+
3
+ module Samsara::ContextConcern
4
+ extend ActiveSupport::Concern
5
+
6
+ # t.string :event_type
7
+ # t.text :event_attributes
8
+ # t.string :environment_name
9
+ # t.string :application_name
10
+ # t.timestamps
11
+
12
+ included do
13
+ has_many :revisions, class_name: Samsara.revision_class_name
14
+
15
+ serialize :event_attributes, Samsara::Serializer
16
+ end
17
+
18
+ def event_class
19
+ event_type.constantize
20
+ end
21
+
22
+ def event
23
+ @event ||= event_class.new(event_attributes)
24
+ end
25
+
26
+ def event=(event)
27
+ self.event_type = event.class.name
28
+ self.event_attributes = event.attributes
29
+ end
30
+
31
+ end
@@ -0,0 +1,37 @@
1
+ module Samsara::Controller
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ before_filter :set_samsara_context
6
+ after_filter :unset_samsara_context
7
+ end
8
+
9
+ def set_samsara_context
10
+ return unless Samsara.active?
11
+ Samsara.current_context = build_samsara_context
12
+ end
13
+
14
+ def unset_samsara_context
15
+ Samsara.current_context = nil
16
+ end
17
+
18
+ def build_samsara_context
19
+ Samsara.context_class.new.tap do |c|
20
+ c.event = build_samsara_http_request
21
+ c.application_name = application_name_for_samsara
22
+ c.environment_name = environment_name_for_samsara
23
+ end
24
+ end
25
+
26
+ def build_samsara_http_request
27
+ Samsara.request_class.build_from(self)
28
+ end
29
+
30
+ def environment_name_for_samsara
31
+ Rails.env
32
+ end
33
+
34
+ def application_name_for_samsara
35
+ Rails.application.class.parent.name
36
+ end
37
+ end
@@ -0,0 +1,32 @@
1
+ class Samsara::HttpRequest
2
+ attr_accessor :attributes
3
+
4
+ def self.build_from(controller)
5
+ self.new(extract_attributes_from controller)
6
+ end
7
+
8
+ def self.extract_attributes_from(controller)
9
+ {
10
+ url: controller.request.filtered_path,
11
+ params: controller.request.filtered_parameters,
12
+ method: controller.request.method
13
+ }
14
+ end
15
+
16
+ def initialize(attributes = {})
17
+ @attributes = attributes
18
+ end
19
+
20
+ def method
21
+ attributes[:method]
22
+ end
23
+
24
+ def url
25
+ attributes[:url]
26
+ end
27
+
28
+ def params
29
+ attributes[:params]
30
+ end
31
+
32
+ end
@@ -0,0 +1,43 @@
1
+ module Samsara::Model
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ def self.is_audited?
6
+ @is_audited || false
7
+ end
8
+
9
+ def self.is_audited
10
+ @is_audited = true
11
+
12
+ has_many :auditing_revisions, class_name: Samsara.revision_class_name, as: :subject
13
+
14
+ after_create :audit_create
15
+ after_update :audit_update, if: :changed?
16
+ after_destroy :audit_destroy, if: :destroyed?
17
+ end
18
+ end
19
+
20
+ def audit_create
21
+ create_audit :create
22
+ end
23
+
24
+ def audit_update
25
+ create_audit :update
26
+ end
27
+
28
+ def audit_destroy
29
+ create_audit :destroy
30
+ end
31
+
32
+ def create_audit(action)
33
+ return unless Samsara.active?
34
+ Samsara.revision_class.new do |a|
35
+ a.action = action
36
+ a.subject = self
37
+ a.context = Samsara.current_context
38
+ a.modified_attributes = self.attributes
39
+ a.original_attributes = self.changed_attributes
40
+ end.save
41
+ end
42
+
43
+ end
@@ -0,0 +1,13 @@
1
+ class Samsara::Railtie < Rails::Railtie
2
+ initializer 'samsara.initialize' do
3
+
4
+ ActiveSupport.on_load(:active_record) do
5
+ include Samsara::Model
6
+ end
7
+
8
+ ActiveSupport.on_load(:action_controller) do
9
+ include Samsara::Controller
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ require 'active_record'
2
+
3
+ class Samsara::Revision < ActiveRecord::Base
4
+
5
+ include Samsara::RevisionConcern
6
+
7
+ end
@@ -0,0 +1,30 @@
1
+ require 'active_support/concern'
2
+
3
+ module Samsara::RevisionConcern
4
+ extend ActiveSupport::Concern
5
+
6
+ # t.string :action
7
+ # t.integer :subject_id
8
+ # t.string :subject_type
9
+ # t.text :modified_attributes
10
+ # t.text :original_attributes
11
+ # t.references :context
12
+ # t.timestamps
13
+
14
+ included do
15
+ belongs_to :subject, polymorphic: true
16
+ belongs_to :context, class_name: Samsara.context_class_name
17
+
18
+ default_scope{ order(:created_at) }
19
+
20
+ serialize :modified_attributes, Samsara::Serializer
21
+ serialize :original_attributes, Samsara::Serializer
22
+ end
23
+
24
+ def attribute_changes
25
+ original_attributes.each_with_object({}) do |(attribute, value), changes|
26
+ changes[attribute] = [value, modified_attributes[attribute]]
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,29 @@
1
+ class Samsara::Serializer
2
+
3
+ def self.dump(arg)
4
+ case arg
5
+ when Hash
6
+ arg.to_json
7
+ else
8
+ arg
9
+ end
10
+ end
11
+
12
+ def self.load(arg)
13
+ case arg
14
+ when String
15
+ load JSON.parse(arg)
16
+ when Hash
17
+ symbolize_keys! arg
18
+ else
19
+ arg
20
+ end
21
+ end
22
+
23
+ def self.symbolize_keys!(arg)
24
+ return arg unless arg.is_a? Hash
25
+ arg.values.each{|val| symbolize_keys! val }
26
+ arg.symbolize_keys!
27
+ end
28
+
29
+ end
@@ -0,0 +1,3 @@
1
+ module Samsara
2
+ VERSION = "0.0.2"
3
+ end
data/lib/samsara.rb ADDED
@@ -0,0 +1,90 @@
1
+ require "samsara/version"
2
+
3
+ module Samsara
4
+
5
+ def self.table_name_prefix
6
+ 'samsara_'
7
+ end
8
+
9
+ def self.active?
10
+ active != :disabled
11
+ end
12
+
13
+ def self.active
14
+ @@auditing_active ||= :disabled
15
+ end
16
+
17
+ def self.active=(active)
18
+ @@auditing_active = active
19
+ end
20
+
21
+ def self.enable!
22
+ @@auditing_active = :enabled
23
+ end
24
+
25
+ def self.disable!
26
+ @@auditing_active = :disabled
27
+ end
28
+
29
+ def self.current_context=(val)
30
+ Thread.current[:samsara_context] = val
31
+ end
32
+
33
+ def self.current_context
34
+ Thread.current[:samsara_context]
35
+ end
36
+
37
+ def self.revision_class_name
38
+ @@revision_class_name ||= "Samsara::Revision"
39
+ end
40
+
41
+ def self.revision_class_name=(name)
42
+ Samsara::Revision.abstract_class = (name != "Samsara::Revision")
43
+ @@revision_class_name = name
44
+ end
45
+
46
+ def self.revision_class
47
+ revision_class_name.constantize
48
+ end
49
+
50
+ def self.context_class_name
51
+ @@context_class_name ||= "Samsara::Context"
52
+ end
53
+
54
+ def self.context_class_name=(name)
55
+ Samsara::Context.abstract_class = (name != "Samsara::Context")
56
+ @@context_class_name = name
57
+ end
58
+
59
+ def self.context_class
60
+ context_class_name.constantize
61
+ end
62
+
63
+ def self.request_class_name
64
+ @@request_class_name ||= "Samsara::HttpRequest"
65
+ end
66
+
67
+ def self.request_class_name=(name)
68
+ Samsara::Context.abstract_class = (name != "Samsara::HttpRequest")
69
+ @@request_class_name = name
70
+ end
71
+
72
+ def self.request_class
73
+ request_class_name.constantize
74
+ end
75
+
76
+ def self.configure(&block)
77
+ yield self
78
+ end
79
+
80
+ end
81
+
82
+ require "samsara/serializer"
83
+ require "samsara/http_request"
84
+ require "samsara/revision_concern"
85
+ require "samsara/revision"
86
+ require "samsara/context_concern"
87
+ require "samsara/context"
88
+ require "samsara/model"
89
+ require "samsara/controller"
90
+ require "samsara/railtie" if defined?(Rails)
data/samsara.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'samsara/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "samsara"
8
+ spec.version = Samsara::VERSION
9
+ spec.authors = ["Tom Nijmeijer"]
10
+ spec.email = ["tom.nijmeijer@nedap.com"]
11
+ spec.summary = "Custom auditing gem made for and by PEP"
12
+ spec.description = <<-DESC
13
+ Custom auditing gem made for and by PEP. Rather than just saving the modifications made,
14
+ this gem puts the changes in context by storing a separate context object. Multiple
15
+ revisions can be attached to a single context such as a single http request.
16
+ DESC
17
+ spec.homepage = ""
18
+ spec.license = "MIT"
19
+
20
+ spec.files = `git ls-files -z`.split("\x0")
21
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
22
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_dependency "activerecord", ">= 3.0"
26
+ spec.add_dependency "activesupport", ">= 3.0"
27
+
28
+ spec.add_development_dependency "bundler", ">= 1.6"
29
+ spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "sqlite3", "~> 1.2"
31
+ spec.add_development_dependency "rspec-rails", "~> 3.2"
32
+ end
@@ -0,0 +1,42 @@
1
+ require 'rails_helper'
2
+
3
+ describe Samsara::Context do
4
+
5
+ let(:celebrity_params) do
6
+ { first_name: "Neil", last_name: "Harris" }
7
+ end
8
+
9
+ let(:params) do
10
+ { celebrity: celebrity_params, controller: "celebrities", action: "create" }
11
+ end
12
+
13
+ let(:event_attributes) do
14
+ { method: "POST", url: "/celebrities", params: params }
15
+ end
16
+
17
+ let(:event) do
18
+ Samsara::HttpRequest.new(event_attributes)
19
+ end
20
+
21
+ let(:context_attributes) do
22
+ { environment_name: "test", application_name: "Dummy", event: event }
23
+ end
24
+
25
+ before { Samsara::Context.create context_attributes }
26
+ subject { Samsara::Context.first }
27
+
28
+ describe "#event_attributes" do
29
+ it "is serialized using the Samsara::Serializer" do
30
+ allow(Samsara::Serializer).to receive(:dump).with(any_args)
31
+ expect(Samsara::Serializer).to receive(:dump).with(event_attributes)
32
+ subject.event_attributes = event_attributes
33
+ end
34
+
35
+ it "is deserialized using the Samsara::Serializer" do
36
+ allow(Samsara::Serializer).to receive(:load).with(any_args)
37
+ expect(Samsara::Serializer).to receive(:load).with(event_attributes.to_json)
38
+ subject.event_attributes
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,122 @@
1
+ require 'rails_helper'
2
+
3
+ describe CelebritiesController, type: :request do
4
+ let(:context_class) { Samsara.context_class }
5
+ let(:revision_class) { Samsara.revision_class }
6
+
7
+ let(:celebrity_params) do
8
+ { first_name: "Brigitte", last_name: "Bardot", gender: "2", birth_date: "1934-9-28" }
9
+ end
10
+
11
+ context "while samsara is not active" do
12
+ before do
13
+ Samsara.disable!
14
+ post(celebrities_path, celebrity: celebrity_params)
15
+ end
16
+
17
+ it "does not create a context" do
18
+ expect(context_class.count).to eq 0
19
+ end
20
+
21
+ it "does not create a revision" do
22
+ expect(revision_class.count).to eq 0
23
+ end
24
+ end
25
+
26
+ context "while samsara is active" do
27
+ before do
28
+ Samsara.enable!
29
+ end
30
+
31
+ context "requesting the index" do
32
+ before do
33
+ get(celebrities_path)
34
+ end
35
+
36
+ it "does not create a context" do
37
+ expect(context_class.count).to eq 0
38
+ end
39
+
40
+ it "does not create a revision" do
41
+ expect(revision_class.count).to eq 0
42
+ end
43
+ end
44
+
45
+ context "creating an invalid celebrity" do
46
+ before do
47
+ post(celebrities_path, celebrity: celebrity_params.merge(gender: 3))
48
+ end
49
+
50
+ it "does not create a context" do
51
+ expect(context_class.count).to eq 0
52
+ end
53
+
54
+ it "does not create a revision" do
55
+ expect(revision_class.count).to eq 0
56
+ end
57
+ end
58
+
59
+ context "creating a single celebrity" do
60
+ before do
61
+ post(celebrities_path, celebrity: celebrity_params, password: "supersecret")
62
+ end
63
+
64
+ it "creates a context" do
65
+ expect(context_class.count).to eq 1
66
+ end
67
+
68
+ it "creates a revision" do
69
+ expect(revision_class.count).to eq 1
70
+ end
71
+
72
+ context "the created context" do
73
+ let(:context) { context_class.first }
74
+
75
+ let(:expected_params) do
76
+ { celebrity: celebrity_params, password: "[FILTERED]", controller: "celebrities", action: "create" }
77
+ end
78
+
79
+ it "has set the application name" do
80
+ expect(context.application_name).to eq "Dummy"
81
+ end
82
+
83
+ it "has set the environment name" do
84
+ expect(context.environment_name).to eq "test"
85
+ end
86
+
87
+ it "has set the http request as the event" do
88
+ expect(context.event).to be_a Samsara::HttpRequest
89
+ expect(context.event.method).to eq "POST"
90
+ expect(context.event.url).to eq celebrities_path
91
+ expect(context.event.params).to eq(expected_params)
92
+ end
93
+
94
+ it "has been linked to the revision" do
95
+ expect(context.revisions.count).to eq 1
96
+ end
97
+ end
98
+ end
99
+
100
+ context "creating multiple celebrities" do
101
+ before do
102
+ post(multiply_celebrities_path, celebrity: celebrity_params, password: "supersecret")
103
+ end
104
+
105
+ it "creates a context" do
106
+ expect(context_class.count).to eq 1
107
+ end
108
+
109
+ it "creates multiple revisions" do
110
+ expect(revision_class.count).to eq 2
111
+ end
112
+
113
+ context "the created context" do
114
+ let(:context) { context_class.first }
115
+
116
+ it "has been linked to all the revisions" do
117
+ expect(context.revisions.count).to eq 2
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
data/spec/dummy/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,28 @@
1
+ == README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
25
+
26
+
27
+ Please feel free to use a different markup language if you do not plan to run
28
+ <tt>rake doc:app</tt>.