ardb 0.24.0 → 0.25.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ardb/adapter/base.rb +19 -0
- data/lib/ardb/adapter_spy.rb +43 -1
- data/lib/ardb/has_slug.rb +104 -0
- data/lib/ardb/runner/create_command.rb +7 -5
- data/lib/ardb/runner/drop_command.rb +7 -5
- data/lib/ardb/runner/migrate_command.rb +9 -28
- data/lib/ardb/test_helpers.rb +35 -2
- data/lib/ardb/use_db_default.rb +2 -2
- data/lib/ardb/version.rb +1 -1
- data/test/unit/adapter/base_tests.rb +38 -1
- data/test/unit/adapter_spy_tests.rb +30 -3
- data/test/unit/has_slug_tests.rb +308 -0
- data/test/unit/runner/connect_command_tests.rb +1 -1
- data/test/unit/runner/create_command_tests.rb +52 -2
- data/test/unit/runner/drop_command_tests.rb +53 -2
- data/test/unit/runner/migrate_command_tests.rb +38 -27
- data/test/unit/test_helpers_tests.rb +67 -1
- data/test/unit/use_db_default_tests.rb +7 -7
- metadata +8 -5
data/lib/ardb/adapter/base.rb
CHANGED
@@ -20,6 +20,25 @@ class Ardb::Adapter::Base
|
|
20
20
|
def create_db(*args); raise NotImplementedError; end
|
21
21
|
def drop_db(*args); raise NotImplementedError; end
|
22
22
|
|
23
|
+
def migrate_db
|
24
|
+
verbose = ENV["MIGRATE_QUIET"].nil?
|
25
|
+
version = ENV["MIGRATE_VERSION"] ? ENV["MIGRATE_VERSION"].to_i : nil
|
26
|
+
migrations_path = Ardb.config.migrations_path
|
27
|
+
|
28
|
+
if defined?(ActiveRecord::Migration::CommandRecorder)
|
29
|
+
require 'ardb/migration_helpers'
|
30
|
+
ActiveRecord::Migration::CommandRecorder.class_eval do
|
31
|
+
include Ardb::MigrationHelpers::RecorderMixin
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
ActiveRecord::Migrator.migrations_path = migrations_path
|
36
|
+
ActiveRecord::Migration.verbose = verbose
|
37
|
+
ActiveRecord::Migrator.migrate(migrations_path, version) do |migration|
|
38
|
+
ENV["MIGRATE_SCOPE"].blank? || (ENV["MIGRATE_SCOPE"] == migration.scope)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
23
42
|
def drop_tables(*args); raise NotImplementedError; end
|
24
43
|
|
25
44
|
def load_schema
|
data/lib/ardb/adapter_spy.rb
CHANGED
@@ -17,21 +17,43 @@ module Ardb
|
|
17
17
|
|
18
18
|
module InstanceMethods
|
19
19
|
|
20
|
-
attr_accessor :drop_tables_called_count
|
20
|
+
attr_accessor :drop_tables_called_count
|
21
|
+
attr_accessor :dump_schema_called_count, :load_schema_called_count
|
21
22
|
attr_accessor :drop_db_called_count, :create_db_called_count
|
23
|
+
attr_accessor :migrate_db_called_count
|
22
24
|
|
23
25
|
def drop_tables_called_count
|
24
26
|
@drop_tables_called_count ||= 0
|
25
27
|
end
|
26
28
|
|
29
|
+
def drop_tables_called?
|
30
|
+
self.drop_tables_called_count > 0
|
31
|
+
end
|
32
|
+
|
27
33
|
def drop_tables(*args, &block)
|
28
34
|
self.drop_tables_called_count += 1
|
29
35
|
end
|
30
36
|
|
37
|
+
def dump_schema_called_count
|
38
|
+
@dump_schema_called_count ||= 0
|
39
|
+
end
|
40
|
+
|
41
|
+
def dump_schema_called?
|
42
|
+
self.dump_schema_called_count > 0
|
43
|
+
end
|
44
|
+
|
45
|
+
def dump_schema(*args, &block)
|
46
|
+
self.dump_schema_called_count += 1
|
47
|
+
end
|
48
|
+
|
31
49
|
def load_schema_called_count
|
32
50
|
@load_schema_called_count ||= 0
|
33
51
|
end
|
34
52
|
|
53
|
+
def load_schema_called?
|
54
|
+
self.load_schema_called_count > 0
|
55
|
+
end
|
56
|
+
|
35
57
|
def load_schema(*args, &block)
|
36
58
|
self.load_schema_called_count += 1
|
37
59
|
end
|
@@ -40,6 +62,10 @@ module Ardb
|
|
40
62
|
@drop_db_called_count ||= 0
|
41
63
|
end
|
42
64
|
|
65
|
+
def drop_db_called?
|
66
|
+
self.drop_db_called_count > 0
|
67
|
+
end
|
68
|
+
|
43
69
|
def drop_db(*args, &block)
|
44
70
|
self.drop_db_called_count += 1
|
45
71
|
end
|
@@ -48,10 +74,26 @@ module Ardb
|
|
48
74
|
@create_db_called_count ||= 0
|
49
75
|
end
|
50
76
|
|
77
|
+
def create_db_called?
|
78
|
+
self.create_db_called_count > 0
|
79
|
+
end
|
80
|
+
|
51
81
|
def create_db(*args, &block)
|
52
82
|
self.create_db_called_count += 1
|
53
83
|
end
|
54
84
|
|
85
|
+
def migrate_db_called_count
|
86
|
+
@migrate_db_called_count ||= 0
|
87
|
+
end
|
88
|
+
|
89
|
+
def migrate_db_called?
|
90
|
+
self.migrate_db_called_count > 0
|
91
|
+
end
|
92
|
+
|
93
|
+
def migrate_db(*args, &block)
|
94
|
+
self.migrate_db_called_count += 1
|
95
|
+
end
|
96
|
+
|
55
97
|
end
|
56
98
|
|
57
99
|
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Ardb
|
2
|
+
|
3
|
+
module HasSlug
|
4
|
+
|
5
|
+
DEFAULT_ATTRIBUTE = :slug
|
6
|
+
DEFAULT_PREPROCESSOR = :downcase
|
7
|
+
DEFAULT_SEPARATOR = '-'.freeze
|
8
|
+
|
9
|
+
def self.included(klass)
|
10
|
+
klass.class_eval do
|
11
|
+
extend ClassMethods
|
12
|
+
include InstanceMethods
|
13
|
+
|
14
|
+
@ardb_has_slug_config = {}
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
|
21
|
+
def has_slug(options = nil)
|
22
|
+
options ||= {}
|
23
|
+
raise(ArgumentError, "a source must be provided") unless options[:source]
|
24
|
+
|
25
|
+
@ardb_has_slug_config.merge!({
|
26
|
+
:attribute => options[:attribute] || DEFAULT_ATTRIBUTE,
|
27
|
+
:source_proc => options[:source].to_proc,
|
28
|
+
:preprocessor_proc => (options[:preprocessor] || DEFAULT_PREPROCESSOR).to_proc,
|
29
|
+
:separator => options[:separator] || DEFAULT_SEPARATOR,
|
30
|
+
:allow_underscores => !!options[:allow_underscores]
|
31
|
+
})
|
32
|
+
|
33
|
+
# since the slug isn't written till an after callback we can't always
|
34
|
+
# validate presence of it
|
35
|
+
validates_presence_of(self.ardb_has_slug_config[:attribute], :on => :update)
|
36
|
+
validates_uniqueness_of(self.ardb_has_slug_config[:attribute], {
|
37
|
+
:case_sensitive => true,
|
38
|
+
:scope => options[:unique_scope]
|
39
|
+
})
|
40
|
+
|
41
|
+
after_create :ardb_has_slug_generate_slug
|
42
|
+
after_update :ardb_has_slug_generate_slug
|
43
|
+
end
|
44
|
+
|
45
|
+
def ardb_has_slug_config
|
46
|
+
@ardb_has_slug_config
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
module InstanceMethods
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def reset_slug
|
56
|
+
self.send("#{self.class.ardb_has_slug_config[:attribute]}=", nil)
|
57
|
+
end
|
58
|
+
|
59
|
+
def ardb_has_slug_generate_slug
|
60
|
+
attr_name = self.class.ardb_has_slug_config[:attribute]
|
61
|
+
slug_source = if !self.send(attr_name) || self.send(attr_name).to_s.empty?
|
62
|
+
self.instance_eval(&self.class.ardb_has_slug_config[:source_proc])
|
63
|
+
else
|
64
|
+
self.send(attr_name)
|
65
|
+
end
|
66
|
+
|
67
|
+
generated_slug = Slug.new(slug_source, {
|
68
|
+
:preprocessor => self.class.ardb_has_slug_config[:preprocessor_proc],
|
69
|
+
:separator => self.class.ardb_has_slug_config[:separator],
|
70
|
+
:allow_underscores => self.class.ardb_has_slug_config[:allow_underscores]
|
71
|
+
})
|
72
|
+
return if self.send(attr_name) == generated_slug
|
73
|
+
self.send("#{attr_name}=", generated_slug)
|
74
|
+
self.update_column(attr_name, generated_slug)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
module Slug
|
80
|
+
DEFAULT_PREPROCESSOR = proc{ |slug| slug } # no-op
|
81
|
+
|
82
|
+
def self.new(string, options = nil)
|
83
|
+
options ||= {}
|
84
|
+
preprocessor = options[:preprocessor] || DEFAULT_PREPROCESSOR
|
85
|
+
separator = options[:separator] || DEFAULT_SEPARATOR
|
86
|
+
allow_underscores = options[:allow_underscores]
|
87
|
+
regexp_escaped_sep = Regexp.escape(separator)
|
88
|
+
|
89
|
+
slug = preprocessor.call(string.to_s)
|
90
|
+
# Turn unwanted chars into the separator
|
91
|
+
slug.gsub!(/[^\w#{regexp_escaped_sep}]+/, separator)
|
92
|
+
# Turn underscores into the separator, unless allowing
|
93
|
+
slug.gsub!(/_/, separator) unless allow_underscores
|
94
|
+
# No more than one of the separator in a row.
|
95
|
+
slug.gsub!(/#{regexp_escaped_sep}{2,}/, separator)
|
96
|
+
# Remove leading/trailing separator.
|
97
|
+
slug.gsub!(/\A#{regexp_escaped_sep}|#{regexp_escaped_sep}\z/, '')
|
98
|
+
slug
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -3,19 +3,21 @@ require 'ardb/runner'
|
|
3
3
|
|
4
4
|
class Ardb::Runner::CreateCommand
|
5
5
|
|
6
|
-
def initialize
|
6
|
+
def initialize(out_io = nil, err_io = nil)
|
7
|
+
@out_io = out_io || $stdout
|
8
|
+
@err_io = err_io || $stderr
|
7
9
|
@adapter = Ardb::Adapter.send(Ardb.config.db.adapter)
|
8
10
|
end
|
9
11
|
|
10
12
|
def run
|
11
13
|
begin
|
12
14
|
@adapter.create_db
|
13
|
-
|
15
|
+
@out_io.puts "created #{Ardb.config.db.adapter} db `#{Ardb.config.db.database}`"
|
14
16
|
rescue Ardb::Runner::CmdError => e
|
15
17
|
raise e
|
16
|
-
rescue
|
17
|
-
|
18
|
-
|
18
|
+
rescue StandardError => e
|
19
|
+
@err_io.puts e
|
20
|
+
@err_io.puts "error creating #{Ardb.config.db.database.inspect} database"
|
19
21
|
raise Ardb::Runner::CmdFail
|
20
22
|
end
|
21
23
|
end
|
@@ -3,19 +3,21 @@ require 'ardb/runner'
|
|
3
3
|
|
4
4
|
class Ardb::Runner::DropCommand
|
5
5
|
|
6
|
-
def initialize
|
6
|
+
def initialize(out_io = nil, err_io = nil)
|
7
|
+
@out_io = out_io || $stdout
|
8
|
+
@err_io = err_io || $stderr
|
7
9
|
@adapter = Ardb::Adapter.send(Ardb.config.db.adapter)
|
8
10
|
end
|
9
11
|
|
10
12
|
def run
|
11
13
|
begin
|
12
14
|
@adapter.drop_db
|
13
|
-
|
15
|
+
@out_io.puts "dropped #{Ardb.config.db.adapter} db `#{Ardb.config.db.database}`"
|
14
16
|
rescue Ardb::Runner::CmdError => e
|
15
17
|
raise e
|
16
|
-
rescue
|
17
|
-
|
18
|
-
|
18
|
+
rescue StandardError => e
|
19
|
+
@err_io.puts e
|
20
|
+
@err_io.puts "error dropping #{Ardb.config.db.database.inspect} database"
|
19
21
|
raise Ardb::Runner::CmdFail
|
20
22
|
end
|
21
23
|
end
|
@@ -1,47 +1,28 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'active_record'
|
3
3
|
require 'ardb/runner'
|
4
|
-
require 'ardb/migration_helpers'
|
5
4
|
|
6
5
|
class Ardb::Runner::MigrateCommand
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def initialize(out_io = nil, err_io = nil)
|
8
|
+
@out_io = out_io || $stdout
|
9
|
+
@err_io = err_io || $stderr
|
11
10
|
@adapter = Ardb::Adapter.send(Ardb.config.db.adapter)
|
12
|
-
@migrations_path = Ardb.config.migrations_path
|
13
|
-
@version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
14
|
-
@verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
|
15
11
|
end
|
16
12
|
|
17
13
|
def run
|
18
14
|
begin
|
19
15
|
Ardb.init
|
20
|
-
|
16
|
+
@adapter.migrate_db
|
17
|
+
@adapter.dump_schema
|
21
18
|
rescue Ardb::Runner::CmdError => e
|
22
19
|
raise e
|
23
|
-
rescue
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
rescue StandardError => e
|
21
|
+
@err_io.puts "error migrating #{Ardb.config.db.database.inspect} database"
|
22
|
+
@err_io.puts e
|
23
|
+
@err_io.puts e.backtrace
|
27
24
|
raise Ardb::Runner::CmdFail
|
28
25
|
end
|
29
26
|
end
|
30
27
|
|
31
|
-
def migrate_the_db
|
32
|
-
if defined?(ActiveRecord::Migration::CommandRecorder)
|
33
|
-
ActiveRecord::Migration::CommandRecorder.class_eval do
|
34
|
-
include Ardb::MigrationHelpers::RecorderMixin
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
ActiveRecord::Migrator.migrations_path = @migrations_path
|
39
|
-
ActiveRecord::Migration.verbose = @verbose
|
40
|
-
ActiveRecord::Migrator.migrate(@migrations_path, @version) do |migration|
|
41
|
-
ENV["SCOPE"].blank? || (ENV["SCOPE"] == migration.scope)
|
42
|
-
end
|
43
|
-
|
44
|
-
@adapter.dump_schema
|
45
|
-
end
|
46
|
-
|
47
28
|
end
|
data/lib/ardb/test_helpers.rb
CHANGED
@@ -16,9 +16,42 @@ module Ardb::TestHelpers
|
|
16
16
|
Ardb.adapter.load_schema
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
Ardb.adapter.drop_db
|
19
|
+
def create_db!
|
21
20
|
Ardb.adapter.create_db
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_db
|
24
|
+
@create_db ||= begin
|
25
|
+
self.create_db!
|
26
|
+
true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def drop_db!
|
31
|
+
Ardb.adapter.drop_db
|
32
|
+
end
|
33
|
+
|
34
|
+
def drop_db
|
35
|
+
@drop_db ||= begin
|
36
|
+
self.drop_db!
|
37
|
+
true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def migrate_db!
|
42
|
+
Ardb.adapter.migrate_db
|
43
|
+
end
|
44
|
+
|
45
|
+
def migrate_db
|
46
|
+
@migrate_db ||= begin
|
47
|
+
self.migrate_db!
|
48
|
+
true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def reset_db!
|
53
|
+
self.drop_db!
|
54
|
+
self.create_db!
|
22
55
|
self.load_schema
|
23
56
|
end
|
24
57
|
|
data/lib/ardb/use_db_default.rb
CHANGED
@@ -16,7 +16,7 @@ module Ardb
|
|
16
16
|
|
17
17
|
module ClassMethods
|
18
18
|
|
19
|
-
def
|
19
|
+
def ardb_use_db_default_attrs
|
20
20
|
@ardb_use_db_default_attrs
|
21
21
|
end
|
22
22
|
|
@@ -35,7 +35,7 @@ module Ardb
|
|
35
35
|
# this allows the attr to be defaulted by the DB, this keeps
|
36
36
|
# activerecord from adding the attr into the sql `INSERT`, which will
|
37
37
|
# make the DB default its value
|
38
|
-
unchanged_names = self.class.
|
38
|
+
unchanged_names = self.class.ardb_use_db_default_attrs.reject do |name|
|
39
39
|
self.send("#{name}_changed?")
|
40
40
|
end
|
41
41
|
unchanged_names.each{ |name| @attributes.delete(name) }
|
data/lib/ardb/version.rb
CHANGED
@@ -13,7 +13,7 @@ class Ardb::Adapter::Base
|
|
13
13
|
should have_readers :config_settings, :database
|
14
14
|
should have_readers :ruby_schema_path, :sql_schema_path
|
15
15
|
should have_imeths :foreign_key_add_sql, :foreign_key_drop_sql
|
16
|
-
should have_imeths :create_db, :drop_db
|
16
|
+
should have_imeths :create_db, :drop_db, :migrate_db
|
17
17
|
should have_imeths :load_schema, :load_ruby_schema, :load_sql_schema
|
18
18
|
should have_imeths :dump_schema, :dump_ruby_schema, :dump_sql_schema
|
19
19
|
|
@@ -51,6 +51,43 @@ class Ardb::Adapter::Base
|
|
51
51
|
|
52
52
|
end
|
53
53
|
|
54
|
+
class MigrateDbTests < UnitTests
|
55
|
+
desc "`migrate_db`"
|
56
|
+
setup do
|
57
|
+
ENV["MIGRATE_VERSION"] = Factory.integer.to_s if Factory.boolean
|
58
|
+
ENV["MIGRATE_QUIET"] = Factory.boolean.to_s if Factory.boolean
|
59
|
+
|
60
|
+
@migrator_called_with = []
|
61
|
+
Assert.stub(ActiveRecord::Migrator, :migrate) do |*args|
|
62
|
+
@migrator_called_with = args
|
63
|
+
end
|
64
|
+
|
65
|
+
@adapter.migrate_db
|
66
|
+
end
|
67
|
+
|
68
|
+
should "add the Ardb MigrationHelper Recorder to the ActiveRecord Command Recorder" do
|
69
|
+
exp = Ardb::MigrationHelpers::RecorderMixin
|
70
|
+
assert_includes exp, ActiveRecord::Migration::CommandRecorder
|
71
|
+
end
|
72
|
+
|
73
|
+
should "set the ActiveRecord Migrator's migrations path" do
|
74
|
+
exp = Ardb.config.migrations_path
|
75
|
+
assert_equal exp, ActiveRecord::Migrator.migrations_path
|
76
|
+
end
|
77
|
+
|
78
|
+
should "set the ActiveRecord Migration's verbose" do
|
79
|
+
exp = ENV["MIGRATE_QUIET"].nil?
|
80
|
+
assert_equal exp, ActiveRecord::Migration.verbose
|
81
|
+
end
|
82
|
+
|
83
|
+
should "call the ActiveRecord Migrator's migrate" do
|
84
|
+
version = ENV.key?("MIGRATE_VERSION") ? ENV["MIGRATE_VERSION"].to_i : nil
|
85
|
+
exp = [Ardb.config.migrations_path, version]
|
86
|
+
assert_equal exp, @migrator_called_with
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
54
91
|
class LoadAndDumpSchemaTests < UnitTests
|
55
92
|
setup do
|
56
93
|
@orig_stdout = $stdout.dup
|
@@ -14,9 +14,16 @@ module Ardb::AdapterSpy
|
|
14
14
|
end
|
15
15
|
subject{ @adapter }
|
16
16
|
|
17
|
-
should have_accessors :drop_tables_called_count
|
17
|
+
should have_accessors :drop_tables_called_count
|
18
|
+
should have_accessors :dump_schema_called_count, :load_schema_called_count
|
18
19
|
should have_accessors :drop_db_called_count, :create_db_called_count
|
19
|
-
should
|
20
|
+
should have_accessors :migrate_db_called_count
|
21
|
+
should have_imeths :drop_tables_called?, :drop_tables
|
22
|
+
should have_imeths :dump_schema_called?, :dump_schema
|
23
|
+
should have_imeths :load_schema_called?, :load_schema
|
24
|
+
should have_imeths :drop_db_called?, :drop_db
|
25
|
+
should have_imeths :create_db_called?, :create_db
|
26
|
+
should have_imeths :migrate_db_called?, :migrate_db
|
20
27
|
|
21
28
|
should "included the record spy instance methods" do
|
22
29
|
assert_includes Ardb::AdapterSpy::InstanceMethods, subject.class
|
@@ -24,23 +31,43 @@ module Ardb::AdapterSpy
|
|
24
31
|
|
25
32
|
should "default all call counts to zero" do
|
26
33
|
assert_equal 0, subject.drop_tables_called_count
|
34
|
+
assert_equal 0, subject.dump_schema_called_count
|
27
35
|
assert_equal 0, subject.load_schema_called_count
|
28
36
|
assert_equal 0, subject.drop_db_called_count
|
29
37
|
assert_equal 0, subject.create_db_called_count
|
38
|
+
assert_equal 0, subject.migrate_db_called_count
|
30
39
|
end
|
31
40
|
|
32
|
-
should "
|
41
|
+
should "know if and how many times a method is called" do
|
42
|
+
assert_equal false, subject.drop_tables_called?
|
33
43
|
subject.drop_tables
|
34
44
|
assert_equal 1, subject.drop_tables_called_count
|
45
|
+
assert_equal true, subject.drop_tables_called?
|
35
46
|
|
47
|
+
assert_equal false, subject.dump_schema_called?
|
48
|
+
subject.dump_schema
|
49
|
+
assert_equal 1, subject.dump_schema_called_count
|
50
|
+
assert_equal true, subject.dump_schema_called?
|
51
|
+
|
52
|
+
assert_equal false, subject.load_schema_called?
|
36
53
|
subject.load_schema
|
37
54
|
assert_equal 1, subject.load_schema_called_count
|
55
|
+
assert_equal true, subject.load_schema_called?
|
38
56
|
|
57
|
+
assert_equal false, subject.drop_db_called?
|
39
58
|
subject.drop_db
|
40
59
|
assert_equal 1, subject.drop_db_called_count
|
60
|
+
assert_equal true, subject.drop_db_called?
|
41
61
|
|
62
|
+
assert_equal false, subject.create_db_called?
|
42
63
|
subject.create_db
|
43
64
|
assert_equal 1, subject.create_db_called_count
|
65
|
+
assert_equal true, subject.create_db_called?
|
66
|
+
|
67
|
+
assert_equal false, subject.migrate_db_called?
|
68
|
+
subject.migrate_db
|
69
|
+
assert_equal 1, subject.migrate_db_called_count
|
70
|
+
assert_equal true, subject.migrate_db_called?
|
44
71
|
end
|
45
72
|
|
46
73
|
end
|
@@ -0,0 +1,308 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'ardb/has_slug'
|
3
|
+
|
4
|
+
require 'ardb/record_spy'
|
5
|
+
|
6
|
+
module Ardb::HasSlug
|
7
|
+
|
8
|
+
class UnitTests < Assert::Context
|
9
|
+
desc "Ardb::HasSlug"
|
10
|
+
setup do
|
11
|
+
source_attribute = @source_attribute = Factory.string.to_sym
|
12
|
+
slug_attribute = @slug_attribute = Factory.string.to_sym
|
13
|
+
@record_class = Ardb::RecordSpy.new do
|
14
|
+
include Ardb::HasSlug
|
15
|
+
attr_accessor source_attribute, slug_attribute
|
16
|
+
attr_reader :slug_db_column_name, :slug_db_column_value
|
17
|
+
|
18
|
+
def update_column(name, value)
|
19
|
+
@slug_db_column_name = name
|
20
|
+
@slug_db_column_value = value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
subject{ @record_class }
|
25
|
+
|
26
|
+
NON_WORD_CHARS = ((' '..'/').to_a + (':'..'@').to_a + ('['..'`').to_a +
|
27
|
+
('{'..'~').to_a - ['-', '_']).freeze
|
28
|
+
|
29
|
+
should have_imeths :has_slug
|
30
|
+
should have_imeths :ardb_has_slug_config
|
31
|
+
|
32
|
+
should "know its default attribute, preprocessor and separator" do
|
33
|
+
assert_equal :slug, DEFAULT_ATTRIBUTE
|
34
|
+
assert_equal :downcase, DEFAULT_PREPROCESSOR
|
35
|
+
assert_equal '-', DEFAULT_SEPARATOR
|
36
|
+
end
|
37
|
+
|
38
|
+
should "not have any has-slug config by default" do
|
39
|
+
assert_equal({}, subject.ardb_has_slug_config)
|
40
|
+
end
|
41
|
+
|
42
|
+
should "default the has slug config using `has_slug`" do
|
43
|
+
subject.has_slug :source => @source_attribute
|
44
|
+
string = Factory.string
|
45
|
+
record = subject.new.tap{ |r| r.send("#{@source_attribute}=", string) }
|
46
|
+
|
47
|
+
assert_equal DEFAULT_ATTRIBUTE, subject.ardb_has_slug_config[:attribute]
|
48
|
+
assert_equal DEFAULT_SEPARATOR, subject.ardb_has_slug_config[:separator]
|
49
|
+
assert_false subject.ardb_has_slug_config[:allow_underscores]
|
50
|
+
|
51
|
+
source_proc = subject.ardb_has_slug_config[:source_proc]
|
52
|
+
assert_instance_of Proc, source_proc
|
53
|
+
exp = record.send(@source_attribute)
|
54
|
+
assert_equal exp, record.instance_eval(&source_proc)
|
55
|
+
|
56
|
+
upcase_string = string.upcase
|
57
|
+
preprocessor_proc = subject.ardb_has_slug_config[:preprocessor_proc]
|
58
|
+
assert_instance_of Proc, preprocessor_proc
|
59
|
+
exp = upcase_string.send(DEFAULT_PREPROCESSOR)
|
60
|
+
assert_equal exp, preprocessor_proc.call(upcase_string)
|
61
|
+
end
|
62
|
+
|
63
|
+
should "allow customizing the has slug config using `has_slug`" do
|
64
|
+
separator = NON_WORD_CHARS.choice
|
65
|
+
allow_underscore = Factory.boolean
|
66
|
+
subject.has_slug({
|
67
|
+
:attribute => @slug_attribute,
|
68
|
+
:source => @source_attribute,
|
69
|
+
:preprocessor => :upcase,
|
70
|
+
:separator => separator,
|
71
|
+
:allow_underscores => allow_underscore
|
72
|
+
})
|
73
|
+
|
74
|
+
assert_equal @slug_attribute, subject.ardb_has_slug_config[:attribute]
|
75
|
+
assert_equal separator, subject.ardb_has_slug_config[:separator]
|
76
|
+
assert_equal allow_underscore, subject.ardb_has_slug_config[:allow_underscores]
|
77
|
+
|
78
|
+
value = Factory.string.downcase
|
79
|
+
preprocessor_proc = subject.ardb_has_slug_config[:preprocessor_proc]
|
80
|
+
assert_instance_of Proc, preprocessor_proc
|
81
|
+
assert_equal value.upcase, preprocessor_proc.call(value)
|
82
|
+
end
|
83
|
+
|
84
|
+
should "add validations using `has_slug`" do
|
85
|
+
subject.has_slug :source => @source_attribute
|
86
|
+
|
87
|
+
validation = subject.validations.find{ |v| v.type == :presence }
|
88
|
+
assert_not_nil validation
|
89
|
+
assert_equal [subject.ardb_has_slug_config[:attribute]], validation.columns
|
90
|
+
assert_equal :update, validation.options[:on]
|
91
|
+
|
92
|
+
validation = subject.validations.find{ |v| v.type == :uniqueness }
|
93
|
+
assert_not_nil validation
|
94
|
+
assert_equal [subject.ardb_has_slug_config[:attribute]], validation.columns
|
95
|
+
assert_equal true, validation.options[:case_sensitive]
|
96
|
+
assert_nil validation.options[:scope]
|
97
|
+
end
|
98
|
+
|
99
|
+
should "allow customizing its validations using `has_slug`" do
|
100
|
+
unique_scope = Factory.string.to_sym
|
101
|
+
subject.has_slug({
|
102
|
+
:source => @source_attribute,
|
103
|
+
:unique_scope => unique_scope
|
104
|
+
})
|
105
|
+
|
106
|
+
validation = subject.validations.find{ |v| v.type == :uniqueness }
|
107
|
+
assert_not_nil validation
|
108
|
+
assert_equal unique_scope, validation.options[:scope]
|
109
|
+
end
|
110
|
+
|
111
|
+
should "add callbacks using `has_slug`" do
|
112
|
+
subject.has_slug :source => @source_attribute
|
113
|
+
|
114
|
+
callback = subject.callbacks.find{ |v| v.type == :after_create }
|
115
|
+
assert_not_nil callback
|
116
|
+
assert_equal [:ardb_has_slug_generate_slug], callback.args
|
117
|
+
|
118
|
+
callback = subject.callbacks.find{ |v| v.type == :after_update }
|
119
|
+
assert_not_nil callback
|
120
|
+
assert_equal [:ardb_has_slug_generate_slug], callback.args
|
121
|
+
end
|
122
|
+
|
123
|
+
should "raise an argument error if `has_slug` isn't passed a source" do
|
124
|
+
assert_raises(ArgumentError){ subject.has_slug }
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
class InitTests < UnitTests
|
130
|
+
desc "when init"
|
131
|
+
setup do
|
132
|
+
@preprocessor = [:downcase, :upcase, :capitalize].choice
|
133
|
+
@separator = NON_WORD_CHARS.choice
|
134
|
+
@allow_underscores = Factory.boolean
|
135
|
+
@record_class.has_slug({
|
136
|
+
:attribute => @slug_attribute,
|
137
|
+
:source => @source_attribute,
|
138
|
+
:preprocessor => @preprocessor,
|
139
|
+
:separator => @separator,
|
140
|
+
:allow_underscores => @allow_underscores,
|
141
|
+
})
|
142
|
+
|
143
|
+
@record = @record_class.new
|
144
|
+
|
145
|
+
# create a string that has mixed case and an underscore so we can test
|
146
|
+
# that it uses the preprocessor and allow underscores options when
|
147
|
+
# generating a slug
|
148
|
+
@source_value = "#{Factory.string.downcase}_#{Factory.string.upcase}"
|
149
|
+
@record.send("#{@source_attribute}=", @source_value)
|
150
|
+
end
|
151
|
+
subject{ @record }
|
152
|
+
|
153
|
+
should "reset its slug using `reset_slug`" do
|
154
|
+
subject.send("#{@slug_attribute}=", Factory.slug)
|
155
|
+
assert_not_nil subject.send(@slug_attribute)
|
156
|
+
subject.instance_eval{ reset_slug }
|
157
|
+
assert_nil subject.send(@slug_attribute)
|
158
|
+
end
|
159
|
+
|
160
|
+
should "default its slug attribute using `ardb_has_slug_generate_slug`" do
|
161
|
+
subject.instance_eval{ ardb_has_slug_generate_slug }
|
162
|
+
|
163
|
+
exp = Slug.new(@source_value, {
|
164
|
+
:preprocessor => @preprocessor.to_proc,
|
165
|
+
:separator => @separator,
|
166
|
+
:allow_underscores => @allow_underscores
|
167
|
+
})
|
168
|
+
assert_equal exp, subject.send(@slug_attribute)
|
169
|
+
assert_equal @slug_attribute, subject.slug_db_column_name
|
170
|
+
assert_equal exp, subject.slug_db_column_value
|
171
|
+
end
|
172
|
+
|
173
|
+
should "slug its slug attribute value if set using `ardb_has_slug_generate_slug`" do
|
174
|
+
@record.send("#{@slug_attribute}=", @source_value)
|
175
|
+
# change the source attr to some random value, to avoid a false positive
|
176
|
+
@record.send("#{@source_attribute}=", Factory.string)
|
177
|
+
subject.instance_eval{ ardb_has_slug_generate_slug }
|
178
|
+
|
179
|
+
exp = Slug.new(@source_value, {
|
180
|
+
:preprocessor => @preprocessor.to_proc,
|
181
|
+
:separator => @separator,
|
182
|
+
:allow_underscores => @allow_underscores
|
183
|
+
})
|
184
|
+
assert_equal exp, subject.send(@slug_attribute)
|
185
|
+
assert_equal @slug_attribute, subject.slug_db_column_name
|
186
|
+
assert_equal exp, subject.slug_db_column_value
|
187
|
+
end
|
188
|
+
|
189
|
+
should "slug its source even if its already a valid slug using `ardb_has_slug_generate_slug`" do
|
190
|
+
slug_source = Factory.slug
|
191
|
+
@record.send("#{@source_attribute}=", slug_source)
|
192
|
+
# ensure the preprocessor doesn't change our source
|
193
|
+
Assert.stub(slug_source, @preprocessor){ slug_source }
|
194
|
+
|
195
|
+
subject.instance_eval{ ardb_has_slug_generate_slug }
|
196
|
+
|
197
|
+
exp = Slug.new(slug_source, {
|
198
|
+
:preprocessor => @preprocessor.to_proc,
|
199
|
+
:separator => @separator,
|
200
|
+
:allow_underscores => @allow_underscores
|
201
|
+
})
|
202
|
+
assert_equal exp, subject.send(@slug_attribute)
|
203
|
+
assert_equal @slug_attribute, subject.slug_db_column_name
|
204
|
+
assert_equal exp, subject.slug_db_column_value
|
205
|
+
end
|
206
|
+
|
207
|
+
should "not set its slug if it hasn't changed using `ardb_has_slug_generate_slug`" do
|
208
|
+
generated_slug = Slug.new(@source_value, {
|
209
|
+
:preprocessor => @preprocessor.to_proc,
|
210
|
+
:separator => @separator,
|
211
|
+
:allow_underscores => @allow_underscores
|
212
|
+
})
|
213
|
+
@record.send("#{@slug_attribute}=", generated_slug)
|
214
|
+
subject.instance_eval{ ardb_has_slug_generate_slug }
|
215
|
+
|
216
|
+
assert_nil subject.slug_db_column_name
|
217
|
+
assert_nil subject.slug_db_column_value
|
218
|
+
end
|
219
|
+
|
220
|
+
end
|
221
|
+
|
222
|
+
class SlugTests < UnitTests
|
223
|
+
desc "Slug"
|
224
|
+
subject{ Slug }
|
225
|
+
|
226
|
+
should have_imeths :new
|
227
|
+
|
228
|
+
should "know its default preprocessor" do
|
229
|
+
assert_instance_of Proc, Slug::DEFAULT_PREPROCESSOR
|
230
|
+
string = Factory.string
|
231
|
+
assert_same string, Slug::DEFAULT_PREPROCESSOR.call(string)
|
232
|
+
end
|
233
|
+
|
234
|
+
should "not change strings that are made up of valid chars" do
|
235
|
+
string = Factory.string
|
236
|
+
assert_equal string, subject.new(string)
|
237
|
+
string = "#{Factory.string}-#{Factory.string.upcase}"
|
238
|
+
assert_equal string, subject.new(string)
|
239
|
+
end
|
240
|
+
|
241
|
+
should "turn invalid chars into a separator" do
|
242
|
+
string = Factory.integer(3).times.map do
|
243
|
+
"#{Factory.string(3)}#{NON_WORD_CHARS.choice}#{Factory.string(3)}"
|
244
|
+
end.join(NON_WORD_CHARS.choice)
|
245
|
+
assert_equal string.gsub(/[^\w]+/, '-'), subject.new(string)
|
246
|
+
end
|
247
|
+
|
248
|
+
should "allow passing a custom preprocessor proc" do
|
249
|
+
string = "#{Factory.string}-#{Factory.string.upcase}"
|
250
|
+
slug = subject.new(string, :preprocessor => :downcase.to_proc)
|
251
|
+
assert_equal string.downcase, slug
|
252
|
+
|
253
|
+
preprocessor = proc{ |s| s.gsub(/[A-Z]/, 'a') }
|
254
|
+
slug = subject.new(string, :preprocessor => preprocessor)
|
255
|
+
assert_equal preprocessor.call(string), slug
|
256
|
+
end
|
257
|
+
|
258
|
+
should "allow passing a custom separator" do
|
259
|
+
separator = NON_WORD_CHARS.choice
|
260
|
+
|
261
|
+
invalid_char = (NON_WORD_CHARS - [separator]).choice
|
262
|
+
string = "#{Factory.string}#{invalid_char}#{Factory.string}"
|
263
|
+
slug = subject.new(string, :separator => separator)
|
264
|
+
assert_equal string.gsub(/[^\w]+/, separator), slug
|
265
|
+
|
266
|
+
# it won't change the separator in the strings
|
267
|
+
string = "#{Factory.string}#{separator}#{Factory.string}"
|
268
|
+
assert_equal string, subject.new(string, :separator => separator)
|
269
|
+
|
270
|
+
# it will change the default separator now
|
271
|
+
string = "#{Factory.string}-#{Factory.string}"
|
272
|
+
slug = subject.new(string, :separator => separator)
|
273
|
+
assert_equal string.gsub('-', separator), slug
|
274
|
+
end
|
275
|
+
|
276
|
+
should "change underscores into its separator unless allowed" do
|
277
|
+
string = "#{Factory.string}_#{Factory.string}"
|
278
|
+
assert_equal string.gsub('_', '-'), subject.new(string)
|
279
|
+
|
280
|
+
slug = subject.new(string, :allow_underscores => false)
|
281
|
+
assert_equal string.gsub('_', '-'), slug
|
282
|
+
|
283
|
+
assert_equal string, subject.new(string, :allow_underscores => true)
|
284
|
+
end
|
285
|
+
|
286
|
+
should "not allow multiple separators in a row" do
|
287
|
+
string = "#{Factory.string}--#{Factory.string}"
|
288
|
+
assert_equal string.gsub(/-{2,}/, '-'), subject.new(string)
|
289
|
+
|
290
|
+
# remove separators that were added from changing invalid chars
|
291
|
+
invalid_chars = (Factory.integer(3) + 1).times.map{ NON_WORD_CHARS.choice }.join
|
292
|
+
string = "#{Factory.string}#{invalid_chars}#{Factory.string}"
|
293
|
+
assert_equal string.gsub(/[^\w]+/, '-'), subject.new(string)
|
294
|
+
end
|
295
|
+
|
296
|
+
should "remove leading and trailing separators" do
|
297
|
+
string = "-#{Factory.string}-#{Factory.string}-"
|
298
|
+
assert_equal string[1..-2], subject.new(string)
|
299
|
+
|
300
|
+
# remove separators that were added from changing invalid chars
|
301
|
+
invalid_char = NON_WORD_CHARS.choice
|
302
|
+
string = "#{invalid_char}#{Factory.string}-#{Factory.string}#{invalid_char}"
|
303
|
+
assert_equal string[1..-2], subject.new(string)
|
304
|
+
end
|
305
|
+
|
306
|
+
end
|
307
|
+
|
308
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'assert'
|
2
|
+
require 'ardb/adapter_spy'
|
2
3
|
require 'ardb/runner/create_command'
|
3
4
|
|
4
5
|
class Ardb::Runner::CreateCommand
|
@@ -6,12 +7,61 @@ class Ardb::Runner::CreateCommand
|
|
6
7
|
class UnitTests < Assert::Context
|
7
8
|
desc "Ardb::Runner::CreateCommand"
|
8
9
|
setup do
|
9
|
-
@
|
10
|
+
@command_class = Ardb::Runner::CreateCommand
|
10
11
|
end
|
11
|
-
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
class InitTests < UnitTests
|
16
|
+
desc "when init"
|
17
|
+
setup do
|
18
|
+
@adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
|
19
|
+
Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
|
20
|
+
|
21
|
+
# provide an output and error IO to avoid using $stdout/$stderr in tests
|
22
|
+
out_io = err_io = StringIO.new
|
23
|
+
@command = @command_class.new(out_io, err_io)
|
24
|
+
end
|
25
|
+
subject{ @command }
|
12
26
|
|
13
27
|
should have_imeths :run
|
14
28
|
|
15
29
|
end
|
16
30
|
|
31
|
+
class RunTests < InitTests
|
32
|
+
desc "and run"
|
33
|
+
setup do
|
34
|
+
@command.run
|
35
|
+
end
|
36
|
+
|
37
|
+
should "create the db via the adapter" do
|
38
|
+
assert_equal true, @adapter_spy.create_db_called?
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
class RunWithCmdErrorTests < InitTests
|
44
|
+
desc "and run with command errors"
|
45
|
+
setup do
|
46
|
+
Assert.stub(@adapter_spy, :create_db){ raise Ardb::Runner::CmdError.new }
|
47
|
+
end
|
48
|
+
|
49
|
+
should "not handle the error" do
|
50
|
+
assert_raises(Ardb::Runner::CmdError){ subject.run }
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
class RunWithUnspecifiedErrorTests < InitTests
|
56
|
+
desc "and run with a standard error"
|
57
|
+
setup do
|
58
|
+
Assert.stub(@adapter_spy, :create_db){ raise StandardError.new }
|
59
|
+
end
|
60
|
+
|
61
|
+
should "raise a CmdFail error" do
|
62
|
+
assert_raises(Ardb::Runner::CmdFail){ subject.run }
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
17
67
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'assert'
|
2
|
+
require 'ardb/adapter_spy'
|
2
3
|
require 'ardb/runner/drop_command'
|
3
4
|
|
4
5
|
class Ardb::Runner::DropCommand
|
@@ -6,12 +7,62 @@ class Ardb::Runner::DropCommand
|
|
6
7
|
class UnitTests < Assert::Context
|
7
8
|
desc "Ardb::Runner::DropCommand"
|
8
9
|
setup do
|
9
|
-
@
|
10
|
+
@command_class = Ardb::Runner::DropCommand
|
10
11
|
end
|
11
|
-
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
class InitTests < UnitTests
|
16
|
+
desc "when init"
|
17
|
+
setup do
|
18
|
+
@adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
|
19
|
+
Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
|
20
|
+
|
21
|
+
# provide an output and error IO to avoid using $stdout/$stderr in tests
|
22
|
+
out_io = err_io = StringIO.new
|
23
|
+
@command = @command_class.new(out_io, err_io)
|
24
|
+
end
|
25
|
+
subject{ @command }
|
12
26
|
|
13
27
|
should have_imeths :run
|
14
28
|
|
15
29
|
end
|
16
30
|
|
31
|
+
class RunTests < InitTests
|
32
|
+
desc "and run"
|
33
|
+
setup do
|
34
|
+
@command.run
|
35
|
+
end
|
36
|
+
|
37
|
+
should "drop the db via the adapter" do
|
38
|
+
assert_equal true, @adapter_spy.drop_db_called?
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
class RunWithCmdErrorTests < InitTests
|
44
|
+
desc "and run with command errors"
|
45
|
+
setup do
|
46
|
+
Assert.stub(@adapter_spy, :drop_db){ raise Ardb::Runner::CmdError.new }
|
47
|
+
end
|
48
|
+
|
49
|
+
should "not handle the error" do
|
50
|
+
assert_raises(Ardb::Runner::CmdError){ subject.run }
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
class RunWithUnspecifiedErrorTests < InitTests
|
56
|
+
desc "and run with a standard error"
|
57
|
+
setup do
|
58
|
+
Assert.stub(@adapter_spy, :drop_db){ raise StandardError.new }
|
59
|
+
end
|
60
|
+
|
61
|
+
should "raise a CmdFail error" do
|
62
|
+
assert_raises(Ardb::Runner::CmdFail){ subject.run }
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
17
67
|
end
|
68
|
+
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'assert'
|
2
|
+
require 'ardb/adapter_spy'
|
2
3
|
require 'ardb/runner/migrate_command'
|
3
4
|
|
4
5
|
class Ardb::Runner::MigrateCommand
|
@@ -6,54 +7,64 @@ class Ardb::Runner::MigrateCommand
|
|
6
7
|
class UnitTests < Assert::Context
|
7
8
|
desc "Ardb::Runner::MigrateCommand"
|
8
9
|
setup do
|
9
|
-
@
|
10
|
+
@command_class = Ardb::Runner::MigrateCommand
|
10
11
|
end
|
11
|
-
subject{ @cmd }
|
12
12
|
|
13
|
-
|
13
|
+
end
|
14
|
+
|
15
|
+
class InitTests < UnitTests
|
16
|
+
desc "when init"
|
17
|
+
setup do
|
18
|
+
@adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
|
19
|
+
Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
|
14
20
|
|
15
|
-
|
16
|
-
|
21
|
+
@ardb_init_called = false
|
22
|
+
Assert.stub(Ardb, :init){ @ardb_init_called = true }
|
23
|
+
|
24
|
+
# provide an output and error IO to avoid using $stdout/$stderr in tests
|
25
|
+
out_io = err_io = StringIO.new
|
26
|
+
@command = @command_class.new(out_io, err_io)
|
17
27
|
end
|
28
|
+
subject{ @command }
|
29
|
+
|
30
|
+
should have_imeths :run
|
18
31
|
|
19
|
-
|
20
|
-
|
32
|
+
end
|
33
|
+
|
34
|
+
class RunTests < InitTests
|
35
|
+
desc "and run"
|
36
|
+
setup do
|
37
|
+
@command.run
|
21
38
|
end
|
22
39
|
|
23
|
-
should "
|
24
|
-
|
40
|
+
should "initialize Ardb, migrate the db and dump schema via the adapter" do
|
41
|
+
assert_equal true, @ardb_init_called
|
42
|
+
assert_equal true, @adapter_spy.migrate_db_called?
|
43
|
+
assert_equal true, @adapter_spy.dump_schema_called?
|
25
44
|
end
|
26
45
|
|
27
46
|
end
|
28
47
|
|
29
|
-
class
|
30
|
-
desc "
|
48
|
+
class RunWithCmdErrorTests < InitTests
|
49
|
+
desc "and run with command errors"
|
31
50
|
setup do
|
32
|
-
|
33
|
-
@cmd = Ardb::Runner::MigrateCommand.new
|
34
|
-
end
|
35
|
-
teardown do
|
36
|
-
ENV["VERSION"] = nil
|
51
|
+
Assert.stub(@adapter_spy, :migrate_db){ raise Ardb::Runner::CmdError.new }
|
37
52
|
end
|
38
53
|
|
39
|
-
should "
|
40
|
-
|
54
|
+
should "not handle the error" do
|
55
|
+
assert_raises(Ardb::Runner::CmdError){ subject.run }
|
41
56
|
end
|
42
57
|
|
43
58
|
end
|
44
59
|
|
45
|
-
class
|
46
|
-
desc "with a
|
60
|
+
class RunWithUnspecifiedErrorTests < InitTests
|
61
|
+
desc "and run with a standard error"
|
47
62
|
setup do
|
48
|
-
|
49
|
-
@cmd = Ardb::Runner::MigrateCommand.new
|
50
|
-
end
|
51
|
-
teardown do
|
52
|
-
ENV["VERBOSE"] = nil
|
63
|
+
Assert.stub(@adapter_spy, :migrate_db){ raise StandardError.new }
|
53
64
|
end
|
54
65
|
|
55
|
-
should "
|
56
|
-
|
66
|
+
should "raise a CmdFail error" do
|
67
|
+
assert_raises(Ardb::Runner::CmdFail){ subject.run }
|
57
68
|
end
|
58
69
|
|
59
70
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'assert'
|
2
|
+
require 'ardb/adapter_spy'
|
2
3
|
require 'ardb/test_helpers'
|
3
4
|
|
4
5
|
module Ardb::TestHelpers
|
@@ -7,7 +8,9 @@ module Ardb::TestHelpers
|
|
7
8
|
desc "Ardb test helpers"
|
8
9
|
subject{ Ardb::TestHelpers }
|
9
10
|
|
10
|
-
should have_imeths :drop_tables, :load_schema
|
11
|
+
should have_imeths :drop_tables, :load_schema
|
12
|
+
should have_imeths :create_db!, :create_db, :drop_db!, :drop_db
|
13
|
+
should have_imeths :migrate_db!, :migrate_db, :reset_db, :reset_db!
|
11
14
|
|
12
15
|
end
|
13
16
|
|
@@ -45,6 +48,69 @@ module Ardb::TestHelpers
|
|
45
48
|
|
46
49
|
end
|
47
50
|
|
51
|
+
class CreateDbTests < UsageTests
|
52
|
+
desc "create db method"
|
53
|
+
|
54
|
+
should "tell the adapter to create the db only once" do
|
55
|
+
assert_equal 0, @adapter_spy.create_db_called_count
|
56
|
+
subject.create_db
|
57
|
+
assert_equal 1, @adapter_spy.create_db_called_count
|
58
|
+
subject.create_db
|
59
|
+
assert_equal 1, @adapter_spy.create_db_called_count
|
60
|
+
end
|
61
|
+
|
62
|
+
should "force the adapter to create a db" do
|
63
|
+
assert_equal 0, @adapter_spy.create_db_called_count
|
64
|
+
subject.create_db!
|
65
|
+
assert_equal 1, @adapter_spy.create_db_called_count
|
66
|
+
subject.create_db!
|
67
|
+
assert_equal 2, @adapter_spy.create_db_called_count
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
class DropDbTests < UsageTests
|
73
|
+
desc "drop db methods"
|
74
|
+
|
75
|
+
should "tell the adapter to drop the db only once" do
|
76
|
+
assert_equal 0, @adapter_spy.drop_db_called_count
|
77
|
+
subject.drop_db
|
78
|
+
assert_equal 1, @adapter_spy.drop_db_called_count
|
79
|
+
subject.drop_db
|
80
|
+
assert_equal 1, @adapter_spy.drop_db_called_count
|
81
|
+
end
|
82
|
+
|
83
|
+
should "force the adapter to drop a db" do
|
84
|
+
assert_equal 0, @adapter_spy.drop_db_called_count
|
85
|
+
subject.drop_db!
|
86
|
+
assert_equal 1, @adapter_spy.drop_db_called_count
|
87
|
+
subject.drop_db!
|
88
|
+
assert_equal 2, @adapter_spy.drop_db_called_count
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
class MigrateDbTests < UsageTests
|
94
|
+
desc "migrate db methods"
|
95
|
+
|
96
|
+
should "tell the adapter to migrate the db only once" do
|
97
|
+
assert_equal 0, @adapter_spy.migrate_db_called_count
|
98
|
+
subject.migrate_db
|
99
|
+
assert_equal 1, @adapter_spy.migrate_db_called_count
|
100
|
+
subject.migrate_db
|
101
|
+
assert_equal 1, @adapter_spy.migrate_db_called_count
|
102
|
+
end
|
103
|
+
|
104
|
+
should "force the adapter to migrate a db" do
|
105
|
+
assert_equal 0, @adapter_spy.migrate_db_called_count
|
106
|
+
subject.migrate_db!
|
107
|
+
assert_equal 1, @adapter_spy.migrate_db_called_count
|
108
|
+
subject.migrate_db!
|
109
|
+
assert_equal 2, @adapter_spy.migrate_db_called_count
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
48
114
|
class ResetDbTests < UsageTests
|
49
115
|
desc "reset db methods"
|
50
116
|
|
@@ -15,36 +15,36 @@ module Ardb::UseDbDefault
|
|
15
15
|
end
|
16
16
|
subject{ @record_class }
|
17
17
|
|
18
|
-
should have_imeths :use_db_default, :
|
18
|
+
should have_imeths :use_db_default, :ardb_use_db_default_attrs
|
19
19
|
|
20
20
|
should "know its use db default attrs" do
|
21
|
-
assert_equal [], subject.
|
21
|
+
assert_equal [], subject.ardb_use_db_default_attrs
|
22
22
|
end
|
23
23
|
|
24
24
|
should "add use db default attributes using `use_db_default`" do
|
25
25
|
attr_name = Factory.string
|
26
26
|
subject.use_db_default(attr_name)
|
27
|
-
assert_includes attr_name, subject.
|
27
|
+
assert_includes attr_name, subject.ardb_use_db_default_attrs
|
28
28
|
|
29
29
|
attr_names = [Factory.string, Factory.string.to_sym]
|
30
30
|
subject.use_db_default(*attr_names)
|
31
31
|
attr_names.each do |attr_name|
|
32
|
-
assert_includes attr_name.to_s, subject.
|
32
|
+
assert_includes attr_name.to_s, subject.ardb_use_db_default_attrs
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
should "not add duplicate attributes using `use_db_default`" do
|
37
37
|
attr_name = Factory.string
|
38
38
|
subject.use_db_default(attr_name)
|
39
|
-
assert_equal [attr_name], subject.
|
39
|
+
assert_equal [attr_name], subject.ardb_use_db_default_attrs
|
40
40
|
|
41
41
|
subject.use_db_default(attr_name)
|
42
|
-
assert_equal [attr_name], subject.
|
42
|
+
assert_equal [attr_name], subject.ardb_use_db_default_attrs
|
43
43
|
|
44
44
|
more_attr_names = [attr_name, Factory.string]
|
45
45
|
subject.use_db_default(*more_attr_names)
|
46
46
|
exp = ([attr_name] + more_attr_names).uniq
|
47
|
-
assert_equal exp, subject.
|
47
|
+
assert_equal exp, subject.ardb_use_db_default_attrs
|
48
48
|
end
|
49
49
|
|
50
50
|
should "add an around create callback" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ardb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 123
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 25
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.25.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kelly Redding
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2015-
|
19
|
+
date: 2015-12-03 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
@@ -118,6 +118,7 @@ files:
|
|
118
118
|
- lib/ardb/adapter/sqlite.rb
|
119
119
|
- lib/ardb/adapter_spy.rb
|
120
120
|
- lib/ardb/cli.rb
|
121
|
+
- lib/ardb/has_slug.rb
|
121
122
|
- lib/ardb/migration_helpers.rb
|
122
123
|
- lib/ardb/record_spy.rb
|
123
124
|
- lib/ardb/relation_spy.rb
|
@@ -141,6 +142,7 @@ files:
|
|
141
142
|
- test/unit/adapter_spy_tests.rb
|
142
143
|
- test/unit/ardb_tests.rb
|
143
144
|
- test/unit/config_tests.rb
|
145
|
+
- test/unit/has_slug_tests.rb
|
144
146
|
- test/unit/migration_helpers_tests.rb
|
145
147
|
- test/unit/record_spy_tests.rb
|
146
148
|
- test/unit/relation_spy_tests.rb
|
@@ -194,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
196
|
requirements: []
|
195
197
|
|
196
198
|
rubyforge_project:
|
197
|
-
rubygems_version: 1.8.
|
199
|
+
rubygems_version: 1.8.29
|
198
200
|
signing_key:
|
199
201
|
specification_version: 3
|
200
202
|
summary: Activerecord database tools.
|
@@ -208,6 +210,7 @@ test_files:
|
|
208
210
|
- test/unit/adapter_spy_tests.rb
|
209
211
|
- test/unit/ardb_tests.rb
|
210
212
|
- test/unit/config_tests.rb
|
213
|
+
- test/unit/has_slug_tests.rb
|
211
214
|
- test/unit/migration_helpers_tests.rb
|
212
215
|
- test/unit/record_spy_tests.rb
|
213
216
|
- test/unit/relation_spy_tests.rb
|