dbi-dbrc 1.1.9 → 1.5.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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/{CHANGES → CHANGES.md} +52 -21
- data/Gemfile +3 -0
- data/{MANIFEST → MANIFEST.md} +7 -6
- data/README.md +292 -0
- data/Rakefile +9 -28
- data/certs/djberg96_pub.pem +26 -0
- data/dbi-dbrc.gemspec +18 -9
- data/examples/yml/test_yml.rb +5 -5
- data/lib/dbi-dbrc.rb +1 -0
- data/lib/dbi/dbrc.rb +56 -53
- data/spec/dbi_dbrc_spec.rb +236 -0
- data/spec/dbi_dbrc_xml_spec.rb +95 -0
- data/spec/dbi_dbrc_yml_spec.rb +89 -0
- data/spec/spec_helper.rb +5 -0
- metadata +100 -51
- metadata.gz.sig +0 -0
- data/README +0 -260
- data/test/test_dbi_dbrc.rb +0 -198
- data/test/test_dbi_dbrc_xml.rb +0 -159
- data/test/test_dbi_dbrc_yml.rb +0 -157
data/Rakefile
CHANGED
@@ -1,45 +1,26 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/clean'
|
3
|
-
require '
|
3
|
+
require 'rspec/core/rake_task'
|
4
4
|
|
5
|
-
CLEAN.include("**/*.gem", "**/*.rbc")
|
5
|
+
CLEAN.include("**/*.gem", "**/*.rbc", "**/*.lock")
|
6
6
|
|
7
7
|
namespace :gem do
|
8
|
-
desc "Remove any gem files."
|
9
|
-
task :clean do
|
10
|
-
Dir['*.gem'].each{ |f| File.delete(f) }
|
11
|
-
end
|
12
|
-
|
13
8
|
desc "Create the dbi-dbrc gem"
|
14
9
|
task :create => [:clean] do
|
10
|
+
require 'rubygems/package'
|
15
11
|
spec = eval(IO.read('dbi-dbrc.gemspec'))
|
16
|
-
|
12
|
+
spec.signing_key = File.join(Dir.home, '.ssh', 'gem-private_key.pem')
|
13
|
+
Gem::Package.build(spec, true)
|
17
14
|
end
|
18
15
|
|
19
16
|
desc "Install the dbi-dbrc gem"
|
20
17
|
task :install => [:create] do
|
21
18
|
gem = Dir["*.gem"].first
|
22
|
-
sh "gem install #{gem}"
|
19
|
+
sh "gem install -l #{gem}"
|
23
20
|
end
|
24
21
|
end
|
25
22
|
|
26
|
-
|
27
|
-
|
28
|
-
t.warning = true
|
29
|
-
t.verbose = true
|
30
|
-
end
|
31
|
-
|
32
|
-
Rake::TestTask.new(:xml) do |t|
|
33
|
-
t.warning = true
|
34
|
-
t.verbose = true
|
35
|
-
t.test_files = FileList['test/test_dbi_dbrc_xml.rb']
|
36
|
-
end
|
37
|
-
|
38
|
-
Rake::TestTask.new(:yml) do |t|
|
39
|
-
t.warning = true
|
40
|
-
t.verbose = true
|
41
|
-
t.test_files = FileList['test/test_dbi_dbrc_yml.rb']
|
42
|
-
end
|
43
|
-
end
|
23
|
+
desc "Run the test suite"
|
24
|
+
RSpec::Core::RakeTask.new(:spec)
|
44
25
|
|
45
|
-
task :default =>
|
26
|
+
task :default => :spec
|
@@ -0,0 +1,26 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MREwDwYDVQQDDAhkamJl
|
3
|
+
cmc5NjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
|
4
|
+
MB4XDTE4MDMxODE1MjIwN1oXDTI4MDMxNTE1MjIwN1owPzERMA8GA1UEAwwIZGpi
|
5
|
+
ZXJnOTYxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
|
6
|
+
bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALgfaroVM6CI06cxr0/h
|
7
|
+
A+j+pc8fgpRgBVmHFaFunq28GPC3IvW7Nvc3Y8SnAW7pP1EQIbhlwRIaQzJ93/yj
|
8
|
+
u95KpkP7tA9erypnV7dpzBkzNlX14ACaFD/6pHoXoe2ltBxk3CCyyzx70mTqJpph
|
9
|
+
75IB03ni9a8yqn8pmse+s83bFJOAqddSj009sGPcQO+QOWiNxqYv1n5EHcvj2ebO
|
10
|
+
6hN7YTmhx7aSia4qL/quc4DlIaGMWoAhvML7u1fmo53CYxkKskfN8MOecq2vfEmL
|
11
|
+
iLu+SsVVEAufMDDFMXMJlvDsviolUSGMSNRTujkyCcJoXKYYxZSNtIiyd9etI0X3
|
12
|
+
ctu0uhrFyrMZXCedutvXNjUolD5r9KGBFSWH1R9u2I3n3SAyFF2yzv/7idQHLJJq
|
13
|
+
74BMnx0FIq6fCpu5slAipvxZ3ZkZpEXZFr3cIBtO1gFvQWW7E/Y3ijliWJS1GQFq
|
14
|
+
058qERadHGu1yu1dojmFRo6W2KZvY9al2yIlbkpDrD5MYQIDAQABo3cwdTAJBgNV
|
15
|
+
HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUFZsMapgzJimzsbaBG2Tm8j5e
|
16
|
+
AzgwHQYDVR0RBBYwFIESZGpiZXJnOTZAZ21haWwuY29tMB0GA1UdEgQWMBSBEmRq
|
17
|
+
YmVyZzk2QGdtYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAW2tnYixXQtKxgGXq
|
18
|
+
/3iSWG2bLwvxS4go3srO+aRXZHrFUMlJ5W0mCxl03aazxxKTsVVpZD8QZxvK91OQ
|
19
|
+
h9zr9JBYqCLcCVbr8SkmYCi/laxIZxsNE5YI8cC8vvlLI7AMgSfPSnn/Epq1GjGY
|
20
|
+
6L1iRcEDtanGCIvjqlCXO9+BmsnCfEVehqZkQHeYczA03tpOWb6pon2wzvMKSsKH
|
21
|
+
ks0ApVdstSLz1kzzAqem/uHdG9FyXdbTAwH1G4ZPv69sQAFAOCgAqYmdnzedsQtE
|
22
|
+
1LQfaQrx0twO+CZJPcRLEESjq8ScQxWRRkfuh2VeR7cEU7L7KqT10mtUwrvw7APf
|
23
|
+
DYoeCY9KyjIBjQXfbj2ke5u1hZj94Fsq9FfbEQg8ygCgwThnmkTrrKEiMSs3alYR
|
24
|
+
ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
|
25
|
+
WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
|
26
|
+
-----END CERTIFICATE-----
|
data/dbi-dbrc.gemspec
CHANGED
@@ -2,25 +2,34 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'dbi-dbrc'
|
5
|
-
spec.version = '1.
|
5
|
+
spec.version = '1.5.0'
|
6
6
|
spec.author = 'Daniel Berger'
|
7
7
|
spec.email = 'djberg96@gmail.com'
|
8
|
-
spec.license = '
|
8
|
+
spec.license = 'Apache-2.0'
|
9
9
|
spec.summary = 'A simple way to avoid hard-coding passwords with DBI'
|
10
10
|
spec.homepage = 'https://github.com/djberg96/dbi-dbrc'
|
11
11
|
spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
12
12
|
spec.test_files = Dir['test/test*.rb']
|
13
|
+
spec.cert_chain = Dir['certs/*']
|
13
14
|
|
14
|
-
spec.
|
15
|
-
spec.
|
15
|
+
spec.add_development_dependency('rake')
|
16
|
+
spec.add_development_dependency('rspec', '~> 3.9')
|
17
|
+
spec.add_development_dependency('fakefs', '~> 1.3')
|
16
18
|
|
17
|
-
spec.
|
18
|
-
|
19
|
+
spec.metadata = {
|
20
|
+
'homepage_uri' => 'https://github.com/djberg96/dbi-dbrc',
|
21
|
+
'bug_tracker_uri' => 'https://github.com/djberg96/dbi-dbrc/issues',
|
22
|
+
'changelog_uri' => 'https://github.com/djberg96/dbi-dbrc/blob/main/CHANGES',
|
23
|
+
'documentation_uri' => 'https://github.com/djberg96/dbi-dbrc/wiki',
|
24
|
+
'source_code_uri' => 'https://github.com/djberg96/dbi-dbrc',
|
25
|
+
'wiki_uri' => 'https://github.com/djberg96/dbi-dbrc/wiki'
|
26
|
+
}
|
19
27
|
|
20
28
|
if File::ALT_SEPARATOR
|
21
|
-
spec.add_dependency('
|
22
|
-
spec.add_dependency('win32-
|
23
|
-
spec.add_dependency('win32-
|
29
|
+
spec.add_dependency('sys-admin')
|
30
|
+
spec.add_dependency('win32-file-attributes')
|
31
|
+
spec.add_dependency('win32-dir')
|
32
|
+
spec.add_dependency('win32-process')
|
24
33
|
spec.platform = Gem::Platform::CURRENT
|
25
34
|
spec.platform.cpu = 'universal'
|
26
35
|
end
|
data/examples/yml/test_yml.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
#######################################################################
|
2
|
-
#
|
2
|
+
# test_yml.rb
|
3
3
|
#
|
4
|
-
# Simple test script that uses the DBRC::
|
4
|
+
# Simple test script that uses the DBRC::YML subclass.
|
5
5
|
#######################################################################
|
6
6
|
if File.basename(Dir.pwd) == "yml"
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
Dir.chdir "../.."
|
8
|
+
$LOAD_PATH.unshift Dir.pwd + "/lib"
|
9
|
+
Dir.chdir "examples/yml"
|
10
10
|
end
|
11
11
|
|
12
12
|
require "dbi/dbrc"
|
data/lib/dbi-dbrc.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'dbi/dbrc'
|
data/lib/dbi/dbrc.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
if File::ALT_SEPARATOR
|
2
2
|
require 'win32/dir'
|
3
|
-
require 'win32/file'
|
3
|
+
require 'win32/file/attributes'
|
4
4
|
require 'win32/process'
|
5
|
+
require 'sys/admin'
|
6
|
+
else
|
7
|
+
require 'etc'
|
5
8
|
end
|
6
9
|
|
7
|
-
require 'sys/admin'
|
8
10
|
|
9
11
|
# The DBI module serves as a namespace only.
|
10
12
|
module DBI
|
@@ -16,19 +18,27 @@ module DBI
|
|
16
18
|
class Error < StandardError; end
|
17
19
|
|
18
20
|
# The version of the dbi-dbrc library
|
19
|
-
VERSION = '1.
|
21
|
+
VERSION = '1.5.0'.freeze
|
20
22
|
|
21
|
-
|
23
|
+
WINDOWS = File::ALT_SEPARATOR # :no-doc:
|
22
24
|
|
23
25
|
# The database or host to be connected to.
|
24
26
|
attr_accessor :database
|
25
27
|
|
28
|
+
alias :db :database
|
29
|
+
alias :db= :database=
|
30
|
+
alias :host :database
|
31
|
+
alias :host= :database=
|
32
|
+
|
26
33
|
# The user name used for the database or host connection.
|
27
34
|
attr_accessor :user
|
28
35
|
|
29
36
|
# The password associated with the database or host.
|
30
37
|
attr_accessor :password
|
31
38
|
|
39
|
+
alias :passwd :password
|
40
|
+
alias :passwd= :password=
|
41
|
+
|
32
42
|
# The driver associated with the database. This is used to internally to
|
33
43
|
# construct the DSN.
|
34
44
|
attr_accessor :driver
|
@@ -39,9 +49,15 @@ module DBI
|
|
39
49
|
# The maximum number of reconnects a program should make before giving up.
|
40
50
|
attr_accessor :maximum_reconnects
|
41
51
|
|
52
|
+
alias :max_reconn :maximum_reconnects
|
53
|
+
alias :max_reconn= :maximum_reconnects=
|
54
|
+
|
42
55
|
# The timeout, in seconds, for each connection attempt.
|
43
56
|
attr_accessor :timeout
|
44
57
|
|
58
|
+
alias :time_out :timeout
|
59
|
+
alias :time_out= :timeout=
|
60
|
+
|
45
61
|
# The interval, in seconds, between each connection attempt.
|
46
62
|
attr_accessor :interval
|
47
63
|
|
@@ -85,21 +101,16 @@ module DBI
|
|
85
101
|
#
|
86
102
|
def initialize(database, user=nil, dbrc_dir=nil)
|
87
103
|
if dbrc_dir.nil?
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
if @@windows
|
93
|
-
home ||= Sys::Admin.get_user(uid, :localaccount => true).dir
|
94
|
-
else
|
95
|
-
home ||= Sys::Admin.get_user(uid).dir
|
96
|
-
end
|
104
|
+
if WINDOWS
|
105
|
+
home = Sys::Admin.get_user(Process.uid, :localaccount => true).dir
|
106
|
+
else
|
107
|
+
home = Dir.home(Etc.getpwuid.name)
|
97
108
|
end
|
98
109
|
|
99
110
|
# Default to the app data directory on Windows, or root on Unix, if
|
100
111
|
# no home dir can be found.
|
101
112
|
if home.nil?
|
102
|
-
if
|
113
|
+
if WINDOWS
|
103
114
|
home = Dir::APPDATA
|
104
115
|
else
|
105
116
|
home = '/'
|
@@ -107,6 +118,7 @@ module DBI
|
|
107
118
|
end
|
108
119
|
|
109
120
|
@dbrc_file = File.join(home, '.dbrc')
|
121
|
+
dbrc_dir = home
|
110
122
|
else
|
111
123
|
raise Error, 'bad directory' unless File.directory?(dbrc_dir)
|
112
124
|
@dbrc_file = File.join(dbrc_dir, '.dbrc')
|
@@ -128,7 +140,7 @@ module DBI
|
|
128
140
|
# Decrypt and re-encrypt the file if we're on MS Windows and the
|
129
141
|
# file is encrypted.
|
130
142
|
begin
|
131
|
-
if
|
143
|
+
if WINDOWS && File.encrypted?(@dbrc_file)
|
132
144
|
file_was_encrypted = true
|
133
145
|
File.decrypt(@dbrc_file)
|
134
146
|
end
|
@@ -138,7 +150,7 @@ module DBI
|
|
138
150
|
convert_numeric_strings()
|
139
151
|
create_dsn_string()
|
140
152
|
ensure
|
141
|
-
if
|
153
|
+
if WINDOWS && file_was_encrypted
|
142
154
|
File.encrypt(@dbrc_file)
|
143
155
|
end
|
144
156
|
end
|
@@ -189,7 +201,7 @@ module DBI
|
|
189
201
|
File.open(file){ |f|
|
190
202
|
# Permissions must be set to 600 or better on Unix systems.
|
191
203
|
# Must be hidden on Win32 systems.
|
192
|
-
if
|
204
|
+
if WINDOWS
|
193
205
|
unless File.hidden?(file)
|
194
206
|
raise Error, "The .dbrc file must be hidden"
|
195
207
|
end
|
@@ -209,50 +221,41 @@ module DBI
|
|
209
221
|
# Parse the text out of the .dbrc file. This is the only method you
|
210
222
|
# need to redefine if writing your own config handler.
|
211
223
|
def parse_dbrc_config_file(file=@dbrc_file)
|
212
|
-
|
213
|
-
|
214
|
-
|
224
|
+
File.foreach(file){ |line|
|
225
|
+
next if line =~ /^#/ # Ignore comments
|
226
|
+
db, user, pwd, driver, timeout, max, interval = line.split
|
215
227
|
|
216
|
-
|
228
|
+
next unless @database == db
|
217
229
|
|
218
|
-
|
219
|
-
|
220
|
-
|
230
|
+
if @user
|
231
|
+
next unless @user == user
|
232
|
+
end
|
221
233
|
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
234
|
+
@user = user
|
235
|
+
@password = pwd
|
236
|
+
@driver = driver
|
237
|
+
@timeout = timeout
|
238
|
+
@maximum_reconnects = max
|
239
|
+
@interval = interval
|
240
|
+
return
|
241
|
+
}
|
230
242
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
243
|
+
# If we reach here it means the database and/or user wasn't found
|
244
|
+
if @user
|
245
|
+
err = "no record found for #{@user}@#{@database}"
|
246
|
+
else
|
247
|
+
err = "no record found for #{@database}"
|
248
|
+
end
|
237
249
|
|
238
|
-
|
250
|
+
raise Error, err
|
239
251
|
end
|
240
252
|
|
241
|
-
alias_method(:db, :database)
|
242
|
-
alias_method(:db=, :database=)
|
243
|
-
alias_method(:passwd, :password)
|
244
|
-
alias_method(:passwd=, :password=)
|
245
|
-
alias_method(:max_reconn, :maximum_reconnects)
|
246
|
-
alias_method(:max_reconn=, :maximum_reconnects=)
|
247
|
-
alias_method(:time_out, :timeout)
|
248
|
-
alias_method(:time_out=, :timeout=)
|
249
|
-
alias_method(:host, :database)
|
250
253
|
end
|
251
254
|
|
252
255
|
# A subclass of DBRC designed to handle .dbrc files in XML format. The
|
253
256
|
# public methods of this class are identical to DBRC.
|
254
|
-
class XML < DBRC
|
255
|
-
require
|
257
|
+
class DBRC::XML < DBRC
|
258
|
+
require 'rexml/document' # Good enough for small files
|
256
259
|
include REXML
|
257
260
|
|
258
261
|
private
|
@@ -280,8 +283,8 @@ module DBI
|
|
280
283
|
|
281
284
|
# A subclass of DBRC designed to handle .dbrc files in YAML format. The
|
282
285
|
# public methods of this class are identical to DBRC.
|
283
|
-
class YML < DBRC
|
284
|
-
require
|
286
|
+
class DBRC::YML < DBRC
|
287
|
+
require 'yaml'
|
285
288
|
|
286
289
|
private
|
287
290
|
|
@@ -296,7 +299,7 @@ module DBI
|
|
296
299
|
@driver = info["driver"]
|
297
300
|
@interval = info["interval"]
|
298
301
|
@timeout = info["timeout"]
|
299
|
-
@maximum_reconnects = info["
|
302
|
+
@maximum_reconnects = info["maximum_reconnects"]
|
300
303
|
return
|
301
304
|
}
|
302
305
|
}
|
@@ -0,0 +1,236 @@
|
|
1
|
+
#########################################################################
|
2
|
+
# dbi_dbrc_spec.rb
|
3
|
+
#
|
4
|
+
# Specs for the base class of DBI::DBRC. This test case should be
|
5
|
+
# run via the 'rake spec' task.
|
6
|
+
#########################################################################
|
7
|
+
require 'dbi/dbrc'
|
8
|
+
require 'fileutils'
|
9
|
+
require 'spec_helper'
|
10
|
+
require 'pp' # Requiring this ahead of fakefs to address a superclass issue.
|
11
|
+
require 'fakefs/spec_helpers'
|
12
|
+
|
13
|
+
RSpec.describe DBI::DBRC do
|
14
|
+
include FakeFS::SpecHelpers
|
15
|
+
|
16
|
+
let(:windows) { File::ALT_SEPARATOR }
|
17
|
+
let(:home) { File.join(Dir.pwd, 'home', 'someone') }
|
18
|
+
let(:dbrc) { File.join(home, '.dbrc') }
|
19
|
+
|
20
|
+
let(:plain) {
|
21
|
+
%q{
|
22
|
+
foo user1 pwd1 Oracle 40 3 60
|
23
|
+
foo user2 pwd2 OCI8 60 4 60
|
24
|
+
bar user1 pwd3 Oracle 30 2 30
|
25
|
+
baz user3 pwd4
|
26
|
+
}.lstrip
|
27
|
+
}
|
28
|
+
|
29
|
+
let(:db_foo){ 'foo' }
|
30
|
+
let(:db_bar){ 'bar' }
|
31
|
+
let(:db_baz){ 'baz' }
|
32
|
+
let(:user1) { 'user1' }
|
33
|
+
let(:user2) { 'user2' }
|
34
|
+
|
35
|
+
before do
|
36
|
+
allow(Dir).to receive(:home).and_return(home)
|
37
|
+
FileUtils.mkdir_p(home)
|
38
|
+
File.open(dbrc, 'w'){ |fh| fh.write(plain) }
|
39
|
+
File.chmod(0600, dbrc)
|
40
|
+
|
41
|
+
# FakeFS doesn't implement this yet
|
42
|
+
allow_any_instance_of(FakeFS::File::Stat).to receive(:owned?).and_return(true)
|
43
|
+
end
|
44
|
+
|
45
|
+
example "version" do
|
46
|
+
expect(described_class::VERSION).to eq('1.5.0')
|
47
|
+
expect(described_class::VERSION).to be_frozen
|
48
|
+
end
|
49
|
+
|
50
|
+
context "windows", :windows => true do
|
51
|
+
example "constructor raises an error unless the .dbrc file is hidden" do
|
52
|
+
File.unset_attr(plain, File::HIDDEN)
|
53
|
+
expect{ described_class.new(db_foo, user1) }.to raise_error(described_class::Error)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "constructor" do
|
58
|
+
example "constructor raises an error if the permissions are invalid" do
|
59
|
+
File.chmod(0555, dbrc)
|
60
|
+
expect{ described_class.new(db_foo, user1) }.to raise_error(described_class::Error)
|
61
|
+
end
|
62
|
+
|
63
|
+
example "constructor raises an error if no database is provided" do
|
64
|
+
expect{ described_class.new }.to raise_error(ArgumentError)
|
65
|
+
end
|
66
|
+
|
67
|
+
example "constructor works as expected with or without user" do
|
68
|
+
expect{ described_class.new(db_foo, user1) }.not_to raise_error
|
69
|
+
expect{ described_class.new(db_foo, nil) }.not_to raise_error
|
70
|
+
end
|
71
|
+
|
72
|
+
example "constructor fails if the database entry doesn't exist" do
|
73
|
+
expect{ described_class.new('bogus', user1) }.to raise_error(DBI::DBRC::Error)
|
74
|
+
end
|
75
|
+
|
76
|
+
example "constructor fails if the user entry doesn't exist" do
|
77
|
+
expect{ described_class.new(db_foo, 'nobody') }.to raise_error(DBI::DBRC::Error)
|
78
|
+
end
|
79
|
+
|
80
|
+
example "constructor fails if the .dbrc file isn't found in the specified directory" do
|
81
|
+
expect{ described_class.new(db_foo, user1, '/bogusXX') }.to raise_error(DBI::DBRC::Error)
|
82
|
+
end
|
83
|
+
|
84
|
+
example "constructor returns expected values for the same database with different users" do
|
85
|
+
dbrc1 = described_class.new(db_foo, user1)
|
86
|
+
dbrc2 = described_class.new(db_foo, user2)
|
87
|
+
expect(dbrc1.database).to eq(dbrc2.database)
|
88
|
+
expect(dbrc1.user).to eq('user1')
|
89
|
+
expect(dbrc2.user).to eq('user2')
|
90
|
+
end
|
91
|
+
|
92
|
+
example "constructor returns expected values for the same user with different database" do
|
93
|
+
dbrc1 = described_class.new(db_foo, user1)
|
94
|
+
dbrc2 = described_class.new(db_bar, user1)
|
95
|
+
expect(dbrc1.user).to eq(dbrc2.user)
|
96
|
+
expect(dbrc1.database).to eq('foo')
|
97
|
+
expect(dbrc2.database).to eq('bar')
|
98
|
+
end
|
99
|
+
|
100
|
+
example "constructor works as expected if some optional fields are not defined" do
|
101
|
+
dbrc = described_class.new(db_baz)
|
102
|
+
expect(dbrc.user).to eq("user3")
|
103
|
+
expect(dbrc.passwd).to eq("pwd4")
|
104
|
+
expect(dbrc.driver).to be_nil
|
105
|
+
expect(dbrc.interval).to be_nil
|
106
|
+
expect(dbrc.timeout).to be_nil
|
107
|
+
expect(dbrc.max_reconn).to be_nil
|
108
|
+
expect(dbrc.dsn).to be_nil
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "instance methods" do
|
113
|
+
before do
|
114
|
+
@dbrc = DBI::DBRC.new(db_foo)
|
115
|
+
end
|
116
|
+
|
117
|
+
example "basic database getter method and aliases" do
|
118
|
+
expect(@dbrc).to respond_to(:database)
|
119
|
+
expect(@dbrc.method(:database)).to eq(@dbrc.method(:db))
|
120
|
+
expect(@dbrc.method(:database)).to eq(@dbrc.method(:host))
|
121
|
+
end
|
122
|
+
|
123
|
+
example "basic database setter method and alias" do
|
124
|
+
expect(@dbrc).to respond_to(:database=)
|
125
|
+
expect(@dbrc.method(:database=)).to eq(@dbrc.method(:db=))
|
126
|
+
end
|
127
|
+
|
128
|
+
example "database method returns expected value" do
|
129
|
+
expect(@dbrc.database).to eq('foo')
|
130
|
+
end
|
131
|
+
|
132
|
+
example "basic dbrc_dir check" do
|
133
|
+
expect(@dbrc).to respond_to(:dbrc_dir)
|
134
|
+
end
|
135
|
+
|
136
|
+
example "dbrc_dir returns the expected value" do
|
137
|
+
expect(@dbrc.dbrc_dir).to eq(home)
|
138
|
+
end
|
139
|
+
|
140
|
+
example "basic dbrc_file check" do
|
141
|
+
expect(@dbrc).to respond_to(:dbrc_file)
|
142
|
+
end
|
143
|
+
|
144
|
+
example "dbrc_file returns the expected value" do
|
145
|
+
expect(File.basename(@dbrc.dbrc_file)).to eq('.dbrc')
|
146
|
+
end
|
147
|
+
|
148
|
+
example "basic dsn getter check" do
|
149
|
+
expect(@dbrc).to respond_to(:dsn)
|
150
|
+
end
|
151
|
+
|
152
|
+
example "dsn method returns the expected value" do
|
153
|
+
expect(@dbrc.dsn).to eq('dbi:Oracle:foo')
|
154
|
+
end
|
155
|
+
|
156
|
+
example "basic dsn setter check" do
|
157
|
+
expect(@dbrc).to respond_to(:dsn=)
|
158
|
+
end
|
159
|
+
|
160
|
+
example "user getter basic check" do
|
161
|
+
expect(@dbrc).to respond_to(:user)
|
162
|
+
end
|
163
|
+
|
164
|
+
example "user method returns expected value" do
|
165
|
+
expect(@dbrc.user).to eq('user1')
|
166
|
+
end
|
167
|
+
|
168
|
+
example "user setter basic check" do
|
169
|
+
expect(@dbrc).to respond_to(:user=)
|
170
|
+
end
|
171
|
+
|
172
|
+
example "password getter basic check and alias" do
|
173
|
+
expect(@dbrc).to respond_to(:password)
|
174
|
+
expect(@dbrc.method(:password)).to eq(@dbrc.method(:passwd))
|
175
|
+
end
|
176
|
+
|
177
|
+
example "password method returns expected value" do
|
178
|
+
expect(@dbrc.password).to eq("pwd1")
|
179
|
+
end
|
180
|
+
|
181
|
+
example "password setter basic check and alias" do
|
182
|
+
expect(@dbrc).to respond_to(:password=)
|
183
|
+
expect(@dbrc.method(:password=)).to eq(@dbrc.method(:passwd=))
|
184
|
+
end
|
185
|
+
|
186
|
+
example "driver getter basic check" do
|
187
|
+
expect(@dbrc).to respond_to(:driver)
|
188
|
+
end
|
189
|
+
|
190
|
+
example "driver method returns expected value" do
|
191
|
+
expect(@dbrc.driver).to eq("Oracle")
|
192
|
+
end
|
193
|
+
|
194
|
+
example "driver setter basic check" do
|
195
|
+
expect(@dbrc).to respond_to(:driver=)
|
196
|
+
end
|
197
|
+
|
198
|
+
example "interval getter basic check" do
|
199
|
+
expect(@dbrc).to respond_to(:interval)
|
200
|
+
end
|
201
|
+
|
202
|
+
example "interval method returns expected value" do
|
203
|
+
expect(@dbrc.interval).to eq(60)
|
204
|
+
end
|
205
|
+
|
206
|
+
example "interval setter basic check" do
|
207
|
+
expect(@dbrc).to respond_to(:interval=)
|
208
|
+
end
|
209
|
+
|
210
|
+
example "timeout getter basic check" do
|
211
|
+
expect(@dbrc).to respond_to(:timeout)
|
212
|
+
expect(@dbrc.method(:timeout)).to eq(@dbrc.method(:time_out))
|
213
|
+
end
|
214
|
+
|
215
|
+
example "timeout method returns expected value" do
|
216
|
+
expect(@dbrc.timeout).to eq(40)
|
217
|
+
end
|
218
|
+
|
219
|
+
example "timeout setter basic check" do
|
220
|
+
expect(@dbrc).to respond_to(:timeout=)
|
221
|
+
end
|
222
|
+
|
223
|
+
example "max_reconn getter basic check" do
|
224
|
+
expect(@dbrc).to respond_to(:max_reconn)
|
225
|
+
expect(@dbrc.method(:max_reconn)).to eq(@dbrc.method(:maximum_reconnects))
|
226
|
+
end
|
227
|
+
|
228
|
+
example "max_reconn method returns expected value" do
|
229
|
+
expect(@dbrc.max_reconn).to eq(3)
|
230
|
+
end
|
231
|
+
|
232
|
+
example "max_reconn setter basic check" do
|
233
|
+
expect(@dbrc).to respond_to(:max_reconn=)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|