activerecord-nulldb-adapter 0.8.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e4a403aa1ee43e02dd69b91820f308d5085e99eca0684879e60f7fe3d7872e1
4
- data.tar.gz: 84abce618014d4bb49cb903eea65f15ae830de6216531d3e3af709d70d02c03c
3
+ metadata.gz: 4137075c4d3daf6e5aa103fa072bb502e2bcc554783fe306be4e97cfa9ab28ca
4
+ data.tar.gz: 4e6700d83bbfda052a9c84571ae658848bd48265db28494f737ee0185ff9b4cc
5
5
  SHA512:
6
- metadata.gz: 1a6d28b99a18d0705990360b3775d040e78ab4842fc70a20216f8970615115f714112caef2d1b77d0758af32b1420a42d96c8785e1c0580af2523cec77533d32
7
- data.tar.gz: 58b09c97d6777eac6fac477ce39d6297f19a7b8821d5e59af9661144aa673e8cfc5cff642798283bf0e8061e0532b231c802f7ef726ed1463b50deb576b04a82
6
+ metadata.gz: 7325829db82de2146bfcfab5da04d4c249f70ab0e807bf92eb7d84b798d2707566225b8da1ebaae0ed41b770803d7885a0683cb9674abf2eaabfd63c3d00e6a7
7
+ data.tar.gz: '07768a0f9e8bf9d8d669094c08466acfa0774fd11f6e90c858ee6e51d97b38ac5421f8f1d88fafa9455c52ed91a89d8b5d2b24884f6b6019a6dd681fd6d7376f'
@@ -11,13 +11,20 @@ jobs:
11
11
  activerecord_6.0,
12
12
  activerecord_6.1,
13
13
  activerecord_7.0,
14
+ activerecord_7.1,
14
15
  activerecord_master,
15
16
  ]
16
- ruby: ["2.5", "2.6", "2.7", "3.0", "jruby-9.3.1.0"]
17
+ ruby: ["2.5", "2.6", "2.7", "3.0", "3.1", "3.2", "jruby-9.3.1.0"]
17
18
  exclude:
18
19
  - ruby: "3.0"
19
20
  gemfile: activerecord_5.2
20
21
 
22
+ - ruby: "3.1"
23
+ gemfile: activerecord_5.2
24
+
25
+ - ruby: "3.2"
26
+ gemfile: activerecord_5.2
27
+
21
28
  - ruby: "2.5"
22
29
  gemfile: "activerecord_master"
23
30
 
@@ -30,9 +37,18 @@ jobs:
30
37
  - ruby: "2.6"
31
38
  gemfile: "activerecord_7.0"
32
39
 
40
+ - ruby: "2.5"
41
+ gemfile: "activerecord_7.1"
42
+
43
+ - ruby: "2.6"
44
+ gemfile: "activerecord_7.1"
45
+
33
46
  - ruby: "jruby-9.3.1.0"
34
47
  gemfile: "activerecord_7.0"
35
48
 
49
+ - ruby: "jruby-9.3.1.0"
50
+ gemfile: "activerecord_7.1"
51
+
36
52
  - ruby: "jruby-9.3.1.0"
37
53
  gemfile: "activerecord_master"
38
54
 
data/Appraisals CHANGED
@@ -7,7 +7,7 @@ appraise "activerecord-6.0" do
7
7
  end
8
8
 
9
9
  appraise "activerecord-7.0" do
10
- gem "activerecord", "~> 7.0.0.alpha2"
10
+ gem "activerecord", "~> 7.0.0"
11
11
  end
12
12
 
13
13
  appraise "activerecord-master" do
data/CHANGES.md CHANGED
@@ -1,6 +1,19 @@
1
1
  Unreleased
2
2
  ----------
3
3
 
4
+ 1.0.0 (2023-10-16)
5
+ -----------
6
+
7
+ - Add support to Rails 7.1 #124
8
+
9
+ 0.9.0 (2023-03-10)
10
+ -----------
11
+
12
+ - Add support to BigSerial #119
13
+ - Add support to hstore #118
14
+ - Support Postgres type modifiers #117
15
+
16
+
4
17
  0.8.0 (2022-10-28)
5
18
  -----------
6
19
 
data/README.md ADDED
@@ -0,0 +1,157 @@
1
+ [<img src="https://badge.fury.io/rb/activerecord-nulldb-adapter.png" alt="Gem
2
+ Version" />](http://badge.fury.io/rb/activerecord-nulldb-adapter) [<img
3
+ src="https://codeclimate.com/github/nulldb/nulldb.png"
4
+ />](https://codeclimate.com/github/nulldb/nulldb) [<img
5
+ src="https://github.com/nulldb/nulldb/workflows/build/badge.svg?branch=master"
6
+ alt="Build Status" />](https://github.com/nulldb/nulldb/actions)
7
+
8
+ # The NullDB Connection Adapter Plugin
9
+
10
+ ## What
11
+
12
+ NullDB is the Null Object pattern as applied to ActiveRecord database
13
+ adapters. It is a database backend that translates database interactions into
14
+ no-ops. Using NullDB enables you to test your model business logic -
15
+ including `after_save` hooks - without ever touching a real database.
16
+
17
+ ## Compatibility
18
+
19
+ ### Ruby
20
+ Currently supported Ruby versions: MRI 2.5.x, 2.6.x, 2.7.x, 3.X.
21
+
22
+ Experimental support provided for: JRuby
23
+
24
+ ### ActiveRecord
25
+ Any version of ActiveRecord >= 5.2
26
+
27
+ It is tested against AR 5.2, 6.0, 6.1 and master branch.
28
+
29
+ ## Installation
30
+
31
+ gem install activerecord-nulldb-adapter
32
+
33
+ ## How
34
+
35
+ Once installed, NullDB can be used much like any other ActiveRecord database
36
+ adapter:
37
+
38
+ ActiveRecord::Base.establish_connection :adapter => :nulldb
39
+
40
+ NullDB needs to know where you keep your schema file in order to reflect table
41
+ metadata. By default it looks in RAILS_ROOT/db/schema.rb. You can override
42
+ that by setting the `schema` option:
43
+
44
+ ActiveRecord::Base.establish_connection :adapter => :nulldb,
45
+ :schema => 'foo/myschema.rb'
46
+
47
+ NullDB comes with RSpec integration. To replace the database with NullDB in
48
+ all of your specs, put the following in your spec/rails_helper:
49
+
50
+ require 'nulldb_rspec'
51
+ include NullDB::RSpec::NullifiedDatabase
52
+
53
+ after you load your rails environment
54
+
55
+ require File.expand_path('../config/environment', __dir__)
56
+
57
+ otherwise you will encounter issues such as
58
+ ([bug)](https://github.com/nulldb/nulldb/pull/90#issuecomment-496690958).
59
+
60
+ Or if you just want to use NullDB in a specific spec context, you can include
61
+ the same module inside a context:
62
+
63
+ require 'nulldb_rspec'
64
+
65
+ describe Employee, "with access to the database" do
66
+ fixtures :employees
67
+ # ...
68
+ end
69
+
70
+ describe Employee, "with NullDB" do
71
+ include NullDB::RSpec::NullifiedDatabase
72
+ # ...
73
+ end
74
+
75
+ If you want to have NullDB enabled by default but disabled for particular
76
+ contexts then (see this
77
+ [post)](https://web.archive.org/web/20120419204019/http://andywaite.com/2011/5
78
+ /18/rspec-disable-nulldb)
79
+
80
+ NullDB::Rspec provides some custom matcher support for verifying expectations
81
+ about interactions with the database:
82
+
83
+ describe Employee do
84
+ include NullDB::RSpec::NullifiedDatabase
85
+
86
+ it "should cause an insert statement to be executed" do
87
+ Employee.create!
88
+ Employee.connection.should have_executed(:insert)
89
+ end
90
+ end
91
+
92
+ UnitRecord-style verification that no database calls have been made at all can
93
+ be achieved by using the special `:anything` symbol:
94
+
95
+ describe "stuff that shouldn't touch the database" do
96
+ after :each do
97
+ Employee.connection.should_not have_executed(:anything)
98
+ end
99
+ # ...
100
+ end
101
+
102
+ You can also experiment with putting NullDB in your database.yml:
103
+
104
+ unit_test:
105
+ adapter: nulldb
106
+
107
+ However, due to the way Rails hard-codes specific database adapters into its
108
+ standard Rake tasks, you may find that this generates unexpected and
109
+ difficult-to-debug behavior. Workarounds for this are under development.
110
+
111
+ ## Why
112
+
113
+ There are a number of advantages to writing unit tests that never touch the
114
+ database. The biggest is probably speed of execution - unit tests must be
115
+ fast for test-driven development to be practical. Another is separation of
116
+ concerns: unit tests should be exercising only the business logic contained in
117
+ your models, not ActiveRecord. For more on why testing-sans-database is a good
118
+ idea, see:
119
+ http://www.dcmanges.com/blog/rails-unit-record-test-without-the-database.
120
+
121
+ NullDB is one way to separate your unit tests from the database. It was
122
+ inspired by the [ARBS](http://arbs.rubyforge.org/) and
123
+ [UnitRecord](http://unit-test-ar.rubyforge.org/) libraries. It differs from
124
+ them in that rather than modifying parts of ActiveRecord, it implements the
125
+ same [semi-]well-documented public interface that the other standard database
126
+ adapters, like MySQL and SQLServer, implement. This has enabled it to evolve
127
+ to support new ActiveRecord versions relatively easily.
128
+
129
+ One concrete advantage of this null-object pattern design is that it is
130
+ possible with NullDB to test `after_save` hooks. With NullDB, you can call
131
+ `#save` and all of the usual callbacks will be called - but nothing will be
132
+ saved.
133
+
134
+ ## Limitations
135
+
136
+ * It is **not** an in-memory database. Finds will not work. Neither will
137
+ `reload`, currently. Test fixtures won't work either, for obvious
138
+ reasons.
139
+ * It has only the most rudimentery schema/migration support. Complex
140
+ migrations will probably break it.
141
+ * Lots of other things probably don't work. Patches welcome!
142
+
143
+
144
+ ## Who
145
+
146
+ NullDB was originally written by Avdi Grimm <mailto:avdi@avdi.org>. It is
147
+ currently maintained by [Danilo Cabello](https://github.com/cabello).
148
+ Previously maintained by: [Bram de Vries](https://github.com/blaet).
149
+
150
+ ## Where
151
+
152
+ * Homepage: https://github.com/nulldb/nulldb
153
+
154
+
155
+ ## License
156
+
157
+ See the LICENSE file for licensing information.
data/Rakefile CHANGED
@@ -9,6 +9,6 @@ task :default => :spec
9
9
 
10
10
  require 'rdoc/task'
11
11
  Rake::RDocTask.new do |rd|
12
- rd.main = "README.rdoc"
13
- rd.rdoc_files.include("README.rdoc", "LICENSE", "lib/**/*.rb")
12
+ rd.main = "README.md"
13
+ rd.rdoc_files.include("README.md", "LICENSE", "lib/**/*.rb")
14
14
  end
@@ -14,13 +14,13 @@ Gem::Specification.new do |s|
14
14
  s.email = "cabello@users.noreply.github.com"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
- "README.rdoc"
17
+ "README.md"
18
18
  ]
19
19
  s.files = `git ls-files`.split($/)
20
20
  s.homepage = "https://github.com/nulldb/nulldb"
21
21
  s.licenses = ["MIT"]
22
22
 
23
- s.add_runtime_dependency 'activerecord', '>= 5.2.0', '< 7.1'
23
+ s.add_runtime_dependency 'activerecord', '>= 5.2.0', '< 7.2'
24
24
  s.add_development_dependency 'spec'
25
25
  s.add_development_dependency 'rdoc'
26
26
  s.add_development_dependency 'rspec'
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activerecord", "~> 7.0.0.alpha2"
5
+ gem "activerecord", "~> 7.0.0"
6
6
 
7
7
  group :development, :test do
8
8
  gem "spec"
@@ -0,0 +1,17 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 7.1.0"
6
+
7
+ group :development, :test do
8
+ gem "spec"
9
+ gem "rspec", ">= 1.2.9"
10
+ gem "rake"
11
+ gem "rdoc"
12
+ end
13
+
14
+ group :development do
15
+ gem "appraisal"
16
+ gem "simplecov", require: false
17
+ end
@@ -164,22 +164,28 @@ class ActiveRecord::ConnectionAdapters::NullDBAdapter < ActiveRecord::Connection
164
164
  end
165
165
 
166
166
  def exec_query(statement, name = 'SQL', binds = [], options = {})
167
+ internal_exec_query(statement, name, binds, **options)
168
+ end
169
+
170
+ def internal_exec_query(statement, name = 'SQL', binds = [], prepare: false, async: false)
167
171
  self.execution_log << Statement.new(entry_point, statement)
168
172
  EmptyResult.new
169
173
  end
170
174
 
171
- def select_rows(statement, name = nil, binds = [])
175
+ def select_rows(statement, name = nil, binds = [], async: false)
172
176
  [].tap do
173
177
  self.execution_log << Statement.new(entry_point, statement)
174
178
  end
175
179
  end
176
180
 
177
- def insert(statement, name = nil, primary_key = nil, object_id = nil, sequence_name = nil, binds = [])
178
- (object_id || next_unique_id).tap do
179
- with_entry_point(:insert) do
180
- super(statement, name, primary_key, object_id, sequence_name)
181
- end
181
+ def insert(statement, name = nil, primary_key = nil, object_id = nil, sequence_name = nil, binds = [], returning: nil)
182
+ with_entry_point(:insert) do
183
+ super(statement, name, primary_key, object_id, sequence_name)
182
184
  end
185
+
186
+ result = object_id || next_unique_id
187
+
188
+ returning ? [result] : result
183
189
  end
184
190
  alias :create :insert
185
191
 
@@ -343,13 +349,37 @@ class ActiveRecord::ConnectionAdapters::NullDBAdapter < ActiveRecord::Connection
343
349
  [nil, @logger, @config]
344
350
  end
345
351
 
352
+ # Register types only once to avoid ActiveRecord::TypeConflictError
353
+ # in ActiveRecord::Type::Registration#<=>
354
+ REGISTRATION_MUTEX = Mutex.new
355
+
346
356
  def register_types
347
- require 'active_model/type'
357
+ REGISTRATION_MUTEX.synchronize do
358
+ return if self.class.types_registered
359
+
360
+ self.class.types_registered = true
361
+ end
362
+
348
363
  ActiveRecord::Type.register(
349
364
  :primary_key,
350
365
  ActiveModel::Type::Integer,
351
366
  adapter: adapter_name,
352
367
  override: true
353
368
  )
369
+
370
+ ActiveRecord::Type.add_modifier({ array: true }, DummyOID, adapter: :nulldb)
371
+ ActiveRecord::Type.add_modifier({ range: true }, DummyOID, adapter: :nulldb)
372
+ end
373
+
374
+ class << self
375
+ attr_accessor :types_registered
376
+ end
377
+
378
+ class DummyOID < ActiveModel::Type::Value
379
+ attr_reader :subtype
380
+
381
+ def initialize(*args)
382
+ @subtype = args.first
383
+ end
354
384
  end
355
385
  end
@@ -7,7 +7,16 @@ class ActiveRecord::ConnectionAdapters::NullDBAdapter
7
7
  alias_method :interval, :text
8
8
  alias_method :geometry, :text
9
9
  alias_method :serial, :integer
10
+ alias_method :bigserial, :integer
10
11
  alias_method :inet, :string
11
12
  alias_method :jsonb, :json if method_defined? :json
13
+ alias_method :hstore, :json
14
+
15
+ if ::ActiveRecord::VERSION::MAJOR == 7 && ::ActiveRecord::VERSION::MINOR >= 1
16
+ # Avoid check for option validity
17
+ def create_column_definition(name, type, options)
18
+ ActiveRecord::ConnectionAdapters::ColumnDefinition.new(name, type, options)
19
+ end
20
+ end
12
21
  end
13
22
  end
@@ -1,3 +1,3 @@
1
1
  module NullDB
2
- VERSION = "0.8.0"
2
+ VERSION = "1.0.0"
3
3
  end
data/spec/nulldb_spec.rb CHANGED
@@ -490,6 +490,7 @@ describe 'adapter-specific extensions' do
490
490
  t.interval :time_interval
491
491
  t.geometry :feature_geometry, srid: 4326, type: "multi_polygon"
492
492
  t.jsonb :jsonb_column
493
+ t.hstore :hstore_column
493
494
  end
494
495
  end
495
496
  }.to_not raise_error
@@ -503,6 +504,20 @@ describe 'adapter-specific extensions' do
503
504
  should_have_column(ExtendedModel, :jsonb_column, :json)
504
505
  end
505
506
 
507
+ it 'supports ActiveModel attributes with postgres modifiers' do
508
+ class ExtendedModel < ActiveRecord::Base
509
+ attribute :strings, :string, array: true
510
+ attribute :size, :integer, range: true
511
+ end
512
+
513
+ expect(ExtendedModel.type_for_attribute(:strings))
514
+ .to be_a ActiveRecord::ConnectionAdapters::NullDBAdapter::DummyOID
515
+ expect(ExtendedModel.new(strings: %w[a b]).strings).to eq %w[a b]
516
+ expect(ExtendedModel.type_for_attribute(:size))
517
+ .to be_a ActiveRecord::ConnectionAdapters::NullDBAdapter::DummyOID
518
+ expect(ExtendedModel.new(size: 1..5).size).to eq 1..5
519
+ end
520
+
506
521
  it 'registers a primary_key type' do
507
522
  expect(ActiveRecord::Type.lookup(:primary_key, adapter: 'NullDB'))
508
523
  .to be_a(ActiveModel::Type::Integer)
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-nulldb-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Avdi Grimm
8
8
  - Myron Marston
9
9
  - Danilo Cabello
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-10-29 00:00:00.000000000 Z
13
+ date: 2023-10-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: 5.2.0
22
22
  - - "<"
23
23
  - !ruby/object:Gem::Version
24
- version: '7.1'
24
+ version: '7.2'
25
25
  type: :runtime
26
26
  prerelease: false
27
27
  version_requirements: !ruby/object:Gem::Requirement
@@ -31,7 +31,7 @@ dependencies:
31
31
  version: 5.2.0
32
32
  - - "<"
33
33
  - !ruby/object:Gem::Version
34
- version: '7.1'
34
+ version: '7.2'
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: spec
37
37
  requirement: !ruby/object:Gem::Requirement
@@ -138,7 +138,7 @@ executables: []
138
138
  extensions: []
139
139
  extra_rdoc_files:
140
140
  - LICENSE
141
- - README.rdoc
141
+ - README.md
142
142
  files:
143
143
  - ".github/workflows/ruby.yml"
144
144
  - ".gitignore"
@@ -146,13 +146,14 @@ files:
146
146
  - CHANGES.md
147
147
  - Gemfile
148
148
  - LICENSE
149
- - README.rdoc
149
+ - README.md
150
150
  - Rakefile
151
151
  - activerecord-nulldb-adapter.gemspec
152
152
  - gemfiles/activerecord_5.2.gemfile
153
153
  - gemfiles/activerecord_6.0.gemfile
154
154
  - gemfiles/activerecord_6.1.gemfile
155
155
  - gemfiles/activerecord_7.0.gemfile
156
+ - gemfiles/activerecord_7.1.gemfile
156
157
  - gemfiles/activerecord_master.gemfile
157
158
  - lib/active_record/connection_adapters/nulldb_adapter.rb
158
159
  - lib/active_record/connection_adapters/nulldb_adapter/checkpoint.rb
@@ -180,7 +181,7 @@ homepage: https://github.com/nulldb/nulldb
180
181
  licenses:
181
182
  - MIT
182
183
  metadata: {}
183
- post_install_message:
184
+ post_install_message:
184
185
  rdoc_options: []
185
186
  require_paths:
186
187
  - lib
@@ -195,8 +196,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
196
  - !ruby/object:Gem::Version
196
197
  version: '0'
197
198
  requirements: []
198
- rubygems_version: 3.1.4
199
- signing_key:
199
+ rubygems_version: 3.3.26
200
+ signing_key:
200
201
  specification_version: 4
201
202
  summary: The Null Object pattern as applied to ActiveRecord database adapters
202
203
  test_files: []
data/README.rdoc DELETED
@@ -1,154 +0,0 @@
1
- {<img src="https://badge.fury.io/rb/activerecord-nulldb-adapter.png" alt="Gem Version" />}[http://badge.fury.io/rb/activerecord-nulldb-adapter]
2
- {<img src="https://codeclimate.com/github/nulldb/nulldb.png" />}[https://codeclimate.com/github/nulldb/nulldb]
3
- {<img src="https://github.com/nulldb/nulldb/workflows/build/badge.svg?branch=master" alt="Build Status" />}[https://github.com/nulldb/nulldb/actions]
4
-
5
-
6
- = The NullDB Connection Adapter Plugin
7
-
8
- == What
9
-
10
- NullDB is the Null Object pattern as applied to ActiveRecord database
11
- adapters. It is a database backend that translates database
12
- interactions into no-ops. Using NullDB enables you to test your model
13
- business logic - including +after_save+ hooks - without ever touching
14
- a real database.
15
-
16
- == Compatibility
17
-
18
- === Ruby
19
- Currently supported Ruby versions: MRI 2.5.x, 2.6.x, 2.7.x, 3.X.
20
-
21
- Experimental support provided for: JRuby
22
-
23
- === ActiveRecord
24
- Any version of ActiveRecord >= 5.2
25
-
26
- It is tested against AR 5.2, 6.0, 6.1 and master branch.
27
-
28
- == Installation
29
-
30
- gem install activerecord-nulldb-adapter
31
-
32
- == How
33
-
34
- Once installed, NullDB can be used much like any other ActiveRecord
35
- database adapter:
36
-
37
- ActiveRecord::Base.establish_connection :adapter => :nulldb
38
-
39
- NullDB needs to know where you keep your schema file in order to
40
- reflect table metadata. By default it looks in
41
- RAILS_ROOT/db/schema.rb. You can override that by setting the
42
- +schema+ option:
43
-
44
- ActiveRecord::Base.establish_connection :adapter => :nulldb,
45
- :schema => 'foo/myschema.rb'
46
-
47
- NullDB comes with RSpec integration. To replace the database with
48
- NullDB in all of your specs, put the following in your
49
- spec/rails_helper:
50
-
51
- require 'nulldb_rspec'
52
- include NullDB::RSpec::NullifiedDatabase
53
-
54
- after you load your rails environment
55
-
56
- require File.expand_path('../config/environment', __dir__)
57
-
58
- otherwise you will encounter issues such as (bug)[https://github.com/nulldb/nulldb/pull/90#issuecomment-496690958].
59
-
60
- Or if you just want to use NullDB in a specific spec context, you can
61
- include the same module inside a context:
62
-
63
- require 'nulldb_rspec'
64
-
65
- describe Employee, "with access to the database" do
66
- fixtures :employees
67
- # ...
68
- end
69
-
70
- describe Employee, "with NullDB" do
71
- include NullDB::RSpec::NullifiedDatabase
72
- # ...
73
- end
74
-
75
- If you want to have NullDB enabled by default but disabled for particular contexts then (see this post)[https://web.archive.org/web/20120419204019/http://andywaite.com/2011/5/18/rspec-disable-nulldb]
76
-
77
- NullDB::Rspec provides some custom matcher support for verifying
78
- expectations about interactions with the database:
79
-
80
- describe Employee do
81
- include NullDB::RSpec::NullifiedDatabase
82
-
83
- it "should cause an insert statement to be executed" do
84
- Employee.create!
85
- Employee.connection.should have_executed(:insert)
86
- end
87
- end
88
-
89
- UnitRecord-style verification that no database calls have been made at
90
- all can be achieved by using the special +:anything+ symbol:
91
-
92
- describe "stuff that shouldn't touch the database" do
93
- after :each do
94
- Employee.connection.should_not have_executed(:anything)
95
- end
96
- # ...
97
- end
98
-
99
- You can also experiment with putting NullDB in your database.yml:
100
-
101
- unit_test:
102
- adapter: nulldb
103
-
104
- However, due to the way Rails hard-codes specific database adapters
105
- into its standard Rake tasks, you may find that this generates
106
- unexpected and difficult-to-debug behavior. Workarounds for this are
107
- under development.
108
-
109
- == Why
110
-
111
- There are a number of advantages to writing unit tests that never
112
- touch the database. The biggest is probably speed of execution - unit
113
- tests must be fast for test-driven development to be practical.
114
- Another is separation of concerns: unit tests should be exercising
115
- only the business logic contained in your models, not ActiveRecord.
116
- For more on why testing-sans-database is a good idea, see:
117
- http://www.dcmanges.com/blog/rails-unit-record-test-without-the-database.
118
-
119
- NullDB is one way to separate your unit tests from the database. It
120
- was inspired by the ARBS[http://arbs.rubyforge.org/] and
121
- UnitRecord[http://unit-test-ar.rubyforge.org/] libraries. It differs
122
- from them in that rather than modifying parts of ActiveRecord, it
123
- implements the same [semi-]well-documented public interface that the
124
- other standard database adapters, like MySQL and SQLServer,
125
- implement. This has enabled it to evolve to support new ActiveRecord
126
- versions relatively easily.
127
-
128
- One concrete advantage of this null-object pattern design is that it
129
- is possible with NullDB to test +after_save+ hooks. With NullDB, you
130
- can call +#save+ and all of the usual callbacks will be called - but
131
- nothing will be saved.
132
-
133
- == Limitations
134
-
135
- * It is *not* an in-memory database. Finds will not work. Neither
136
- will +reload+, currently. Test fixtures won't work either, for
137
- obvious reasons.
138
- * It has only the most rudimentery schema/migration support. Complex
139
- migrations will probably break it.
140
- * Lots of other things probably don't work. Patches welcome!
141
-
142
- == Who
143
-
144
- NullDB was originally written by Avdi Grimm <mailto:avdi@avdi.org>.
145
- It is currently maintained by {Danilo Cabello}[https://github.com/cabello].
146
- Previously maintained by: {Bram de Vries}[https://github.com/blaet].
147
-
148
- == Where
149
-
150
- * Homepage: https://github.com/nulldb/nulldb
151
-
152
- == License
153
-
154
- See the LICENSE file for licensing information.