rom-cassandra 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +9 -0
- data/.metrics +9 -0
- data/.rspec +2 -0
- data/.rubocop.yml +2 -0
- data/.travis.yml +26 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +7 -0
- data/Guardfile +14 -0
- data/LICENSE +21 -0
- data/README.md +83 -0
- data/Rakefile +34 -0
- data/config/metrics/STYLEGUIDE +230 -0
- data/config/metrics/cane.yml +5 -0
- data/config/metrics/churn.yml +6 -0
- data/config/metrics/flay.yml +2 -0
- data/config/metrics/metric_fu.yml +14 -0
- data/config/metrics/reek.yml +1 -0
- data/config/metrics/roodi.yml +24 -0
- data/config/metrics/rubocop.yml +84 -0
- data/config/metrics/saikuro.yml +3 -0
- data/config/metrics/simplecov.yml +6 -0
- data/config/metrics/yardstick.yml +37 -0
- data/lib/rom-cassandra.rb +3 -0
- data/lib/rom/cassandra.rb +33 -0
- data/lib/rom/cassandra/commands.rb +53 -0
- data/lib/rom/cassandra/commands/batch.rb +54 -0
- data/lib/rom/cassandra/commands/create.rb +38 -0
- data/lib/rom/cassandra/commands/delete.rb +38 -0
- data/lib/rom/cassandra/commands/update.rb +38 -0
- data/lib/rom/cassandra/dataset.rb +102 -0
- data/lib/rom/cassandra/gateway.rb +115 -0
- data/lib/rom/cassandra/migrations.rb +30 -0
- data/lib/rom/cassandra/migrations/generator.rb +68 -0
- data/lib/rom/cassandra/migrations/generator/migration.erb +32 -0
- data/lib/rom/cassandra/migrations/logger.rb +28 -0
- data/lib/rom/cassandra/migrations/migration.rb +107 -0
- data/lib/rom/cassandra/migrations/migrator.rb +103 -0
- data/lib/rom/cassandra/migrations/runner.rb +119 -0
- data/lib/rom/cassandra/migrations/runner_down.rb +49 -0
- data/lib/rom/cassandra/migrations/runner_up.rb +50 -0
- data/lib/rom/cassandra/query.rb +43 -0
- data/lib/rom/cassandra/relation.rb +88 -0
- data/lib/rom/cassandra/session.rb +50 -0
- data/lib/rom/cassandra/tasks.rb +6 -0
- data/lib/rom/cassandra/version.rb +15 -0
- data/lib/tasks/db.rake +16 -0
- data/rom-cassandra.gemspec +33 -0
- data/spec/config/reset_cluster.rb +28 -0
- data/spec/config/rom.rb +3 -0
- data/spec/config/test_module.rb +7 -0
- data/spec/integration/batch_spec.rb +36 -0
- data/spec/integration/create_spec.rb +33 -0
- data/spec/integration/delete_spec.rb +33 -0
- data/spec/integration/migrate/20150825142003_create_users.rb +24 -0
- data/spec/integration/migrate/20150825142024_create_logs.rb +17 -0
- data/spec/integration/migrate_spec.rb +47 -0
- data/spec/integration/relation_spec.rb +27 -0
- data/spec/integration/update_spec.rb +33 -0
- data/spec/shared/fake_migrate_folder.rb +21 -0
- data/spec/shared/users.rb +20 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/unit/commands/batch_spec.rb +86 -0
- data/spec/unit/commands/create_spec.rb +77 -0
- data/spec/unit/commands/delete_spec.rb +77 -0
- data/spec/unit/commands/update_spec.rb +77 -0
- data/spec/unit/dataset_spec.rb +130 -0
- data/spec/unit/gateway_spec.rb +140 -0
- data/spec/unit/migrations/generator_spec.rb +31 -0
- data/spec/unit/migrations/logger_spec.rb +21 -0
- data/spec/unit/migrations/migration_spec.rb +59 -0
- data/spec/unit/migrations/migrator_spec.rb +120 -0
- data/spec/unit/migrations/runner_down_spec.rb +65 -0
- data/spec/unit/migrations/runner_spec.rb +142 -0
- data/spec/unit/migrations/runner_up_spec.rb +67 -0
- data/spec/unit/query_spec.rb +21 -0
- data/spec/unit/relation_spec.rb +142 -0
- data/spec/unit/session_spec.rb +55 -0
- data/spec/unit/tasks/create_migration_spec.rb +41 -0
- metadata +242 -0
@@ -0,0 +1,140 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Gateway do
|
4
|
+
|
5
|
+
let(:gateway) { described_class.new(uri) }
|
6
|
+
let(:uri) { { hosts: ["127.0.0.1"], port: 9042 } }
|
7
|
+
|
8
|
+
describe ".new" do
|
9
|
+
after { described_class.new("127.0.0.2", port: 9042) }
|
10
|
+
|
11
|
+
let(:session_class) { ROM::Cassandra::Session }
|
12
|
+
|
13
|
+
it "creates the session with uri" do
|
14
|
+
allow(session_class).to receive(:new)
|
15
|
+
expect(session_class).to receive(:new).with("127.0.0.2", port: 9042)
|
16
|
+
end
|
17
|
+
end # describe .new
|
18
|
+
|
19
|
+
describe "#options" do
|
20
|
+
subject { gateway.options }
|
21
|
+
|
22
|
+
it "returns a uri" do
|
23
|
+
expect(subject).to eql(uri)
|
24
|
+
end
|
25
|
+
end # describe #options
|
26
|
+
|
27
|
+
describe "#session" do
|
28
|
+
subject { gateway.session }
|
29
|
+
|
30
|
+
it "is a session" do
|
31
|
+
expect(subject).to be_instance_of ROM::Cassandra::Session
|
32
|
+
end
|
33
|
+
|
34
|
+
it "has a proper uri" do
|
35
|
+
expect(subject.uri).to eql uri
|
36
|
+
end
|
37
|
+
end # describe #session
|
38
|
+
|
39
|
+
describe "#[]" do
|
40
|
+
subject { gateway["foo.bar"] }
|
41
|
+
|
42
|
+
context "by default" do
|
43
|
+
it { is_expected.to be_nil }
|
44
|
+
end
|
45
|
+
|
46
|
+
context "registered dataset" do
|
47
|
+
before { gateway.dataset "foo.bar" }
|
48
|
+
|
49
|
+
it { is_expected.to be_instance_of ROM::Cassandra::Dataset }
|
50
|
+
end
|
51
|
+
end # describe #[]
|
52
|
+
|
53
|
+
describe "#dataset?" do
|
54
|
+
subject { gateway.dataset? "foo.bar" }
|
55
|
+
|
56
|
+
context "by default" do
|
57
|
+
it { is_expected.to eql false }
|
58
|
+
end
|
59
|
+
|
60
|
+
context "registered dataset" do
|
61
|
+
before { gateway.dataset "foo.bar" }
|
62
|
+
|
63
|
+
it { is_expected.to eql true }
|
64
|
+
end
|
65
|
+
end # describe #dataset?
|
66
|
+
|
67
|
+
describe "#dataset" do
|
68
|
+
subject { gateway.dataset(name) }
|
69
|
+
|
70
|
+
context "with valid name" do
|
71
|
+
let(:name) { :"foo.bar" }
|
72
|
+
|
73
|
+
it "registers the dataset for given table" do
|
74
|
+
subject
|
75
|
+
dataset = gateway["foo.bar"]
|
76
|
+
|
77
|
+
expect(dataset.session).to eql(gateway.session)
|
78
|
+
expect(dataset.keyspace).to eql :foo
|
79
|
+
expect(dataset.table).to eql :bar
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "with a string name" do
|
84
|
+
let(:name) { "foo.bar" }
|
85
|
+
|
86
|
+
it "registers the dataset for given table" do
|
87
|
+
expect { subject }.to change { gateway[:"foo.bar"] }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "with invalid name" do
|
92
|
+
let(:name) { "foo" }
|
93
|
+
|
94
|
+
it "fails" do
|
95
|
+
expect { subject }.to raise_error do |error|
|
96
|
+
expect(error).to be_kind_of ArgumentError
|
97
|
+
expect(error.message)
|
98
|
+
.to eql "'foo' is not a valid full name of a table. " \
|
99
|
+
"Use format 'keyspace.table' with both keyspace and table parts."
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end # describe #dataset
|
104
|
+
|
105
|
+
describe "#migrate" do
|
106
|
+
let(:klass) { ROM::Cassandra::Migrations::Migrator }
|
107
|
+
let(:session) { gateway.session }
|
108
|
+
let(:migrator) { double :migrator, apply: nil }
|
109
|
+
let(:path) { double :path }
|
110
|
+
let(:version) { double :version }
|
111
|
+
let(:logger) { double :logger }
|
112
|
+
|
113
|
+
before { allow(klass).to receive(:new) { migrator } }
|
114
|
+
|
115
|
+
context "with options" do
|
116
|
+
after { gateway.migrate path: path, version: version, logger: logger }
|
117
|
+
|
118
|
+
it "initializes the migrator" do
|
119
|
+
expect(klass).to receive(:new).with(session, path: path, logger: logger)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "runs the migrator" do
|
123
|
+
expect(migrator).to receive(:apply).with(version: version)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context "without options" do
|
128
|
+
after { gateway.migrate }
|
129
|
+
|
130
|
+
it "initializes the migrator" do
|
131
|
+
expect(klass).to receive(:new).with(session, {})
|
132
|
+
end
|
133
|
+
|
134
|
+
it "runs the migrator" do
|
135
|
+
expect(migrator).to receive(:apply).with({})
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end # describe #migrate
|
139
|
+
|
140
|
+
end # describe ROM:Cassandra::Gateway
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "shared/fake_migrate_folder"
|
4
|
+
require "timecop"
|
5
|
+
|
6
|
+
describe ROM::Cassandra::Migrations::Generator do
|
7
|
+
|
8
|
+
include_context :fake_migrate_folder, "context"
|
9
|
+
|
10
|
+
let(:name) { "createFoo" }
|
11
|
+
let(:time) { Time.utc(2017, "dec", 31, 23, 59, 59) }
|
12
|
+
let(:target) { "#{path}/db/20171231235959_create_foo.rb" }
|
13
|
+
let(:content) { File.read(target) }
|
14
|
+
|
15
|
+
describe ".call" do
|
16
|
+
subject { described_class.call(name, "#{path}/db") }
|
17
|
+
|
18
|
+
before { Timecop.freeze(time) }
|
19
|
+
after { Timecop.return }
|
20
|
+
|
21
|
+
it "creates the migration" do
|
22
|
+
subject
|
23
|
+
expect(content).to include "CreateFoo"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns the name of the migration" do
|
27
|
+
expect(subject).to eql(target)
|
28
|
+
end
|
29
|
+
end # describe .call
|
30
|
+
|
31
|
+
end # describe ROM::Cassandra::Migrations::Generator
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Migrations::Logger do
|
4
|
+
|
5
|
+
let(:logger) { described_class.new }
|
6
|
+
let(:stdout) { StringIO.new }
|
7
|
+
|
8
|
+
before { $stdout = stdout }
|
9
|
+
after { $stdout = STDOUT }
|
10
|
+
|
11
|
+
describe ".new" do
|
12
|
+
subject { logger }
|
13
|
+
|
14
|
+
it { is_expected.to be_kind_of ::Logger }
|
15
|
+
|
16
|
+
it "sends messages to $stdout" do
|
17
|
+
expect { subject.info "text" }.to change { stdout.string }.to "text\n"
|
18
|
+
end
|
19
|
+
end # describe .new
|
20
|
+
|
21
|
+
end # describe ROM::Cassandra::Migrations::Logger
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Migrations::Migration do
|
4
|
+
|
5
|
+
let(:migration) { described_class.new session }
|
6
|
+
let(:session) { double :session, call: nil, freeze: nil }
|
7
|
+
|
8
|
+
describe "#session" do
|
9
|
+
subject { migration.session }
|
10
|
+
|
11
|
+
it { is_expected.to eql session }
|
12
|
+
end # describe #session
|
13
|
+
|
14
|
+
describe "#up" do
|
15
|
+
subject { migration.up }
|
16
|
+
|
17
|
+
it { is_expected.to be_nil }
|
18
|
+
end # describe #up
|
19
|
+
|
20
|
+
describe "#down" do
|
21
|
+
subject { migration.down }
|
22
|
+
|
23
|
+
it { is_expected.to be_nil }
|
24
|
+
end # describe #down
|
25
|
+
|
26
|
+
describe "#call" do
|
27
|
+
subject { migration.call query }
|
28
|
+
let(:query) { double :query, to_s: :foo }
|
29
|
+
|
30
|
+
it "is delegated to #session" do
|
31
|
+
expect(session).to receive(:call).with(:foo)
|
32
|
+
subject
|
33
|
+
end
|
34
|
+
end # describe #call
|
35
|
+
|
36
|
+
describe "#keyspace" do
|
37
|
+
subject { migration.keyspace(:foo) }
|
38
|
+
|
39
|
+
it "starts building query" do
|
40
|
+
query = subject.create.if_not_exists.to_s
|
41
|
+
|
42
|
+
expect(query).to eql "CREATE KEYSPACE IF NOT EXISTS foo;"
|
43
|
+
end
|
44
|
+
end # describe #keyspace
|
45
|
+
|
46
|
+
describe ".inherited" do
|
47
|
+
subject { Class.new described_class }
|
48
|
+
|
49
|
+
it "hides helpers" do
|
50
|
+
expect(subject.private_instance_methods)
|
51
|
+
.to include(:call, :keyspace, :up, :down)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "keeps parent class' helpers unchanged" do
|
55
|
+
expect { subject }.not_to change { described_class.new(session).methods }
|
56
|
+
end
|
57
|
+
end # describe .inherited
|
58
|
+
|
59
|
+
end # describe ROM::Cassandra::Migrations::Migration
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "shared/fake_migrate_folder"
|
4
|
+
|
5
|
+
describe ROM::Cassandra::Migrations::Migrator do
|
6
|
+
|
7
|
+
include_context :fake_migrate_folder, "context"
|
8
|
+
|
9
|
+
let(:migrator) { described_class.new session, logger: logger, path: path }
|
10
|
+
let(:logger) { double :logger }
|
11
|
+
let(:session) { double :session, call: nil }
|
12
|
+
|
13
|
+
describe "#session" do
|
14
|
+
subject { migrator.session }
|
15
|
+
|
16
|
+
it "returns the session by uri" do
|
17
|
+
expect(subject).to eql(session)
|
18
|
+
end
|
19
|
+
end # describe #session
|
20
|
+
|
21
|
+
describe "#logger" do
|
22
|
+
subject { migrator.logger }
|
23
|
+
|
24
|
+
context "when logger is specified" do
|
25
|
+
it { is_expected.to eql logger }
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when logger isn't specified" do
|
29
|
+
let(:migrator) { described_class.new session }
|
30
|
+
|
31
|
+
it { is_expected.to be_kind_of ROM::Cassandra::Migrations::Logger }
|
32
|
+
end
|
33
|
+
end # describe #logger
|
34
|
+
|
35
|
+
describe "#root" do
|
36
|
+
subject { migrator.root }
|
37
|
+
|
38
|
+
context "when path is specified" do
|
39
|
+
it { is_expected.to eql path }
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when path isn't specified" do
|
43
|
+
let(:migrator) { described_class.new session }
|
44
|
+
|
45
|
+
it { is_expected.to eql("db/migrate") }
|
46
|
+
end
|
47
|
+
end # describe #root
|
48
|
+
|
49
|
+
describe "#paths" do
|
50
|
+
subject { migrator.paths }
|
51
|
+
|
52
|
+
it "returns the ordered list of migrations" do
|
53
|
+
expect(subject).to eql(files)
|
54
|
+
end
|
55
|
+
end # describe #paths
|
56
|
+
|
57
|
+
describe "#apply" do
|
58
|
+
before { allow(ROM::Cassandra::Migrations::Runner).to receive(:apply) }
|
59
|
+
|
60
|
+
let(:runner_up) { ROM::Cassandra::Migrations::RunnerUp }
|
61
|
+
let(:runner_down) { ROM::Cassandra::Migrations::RunnerDown }
|
62
|
+
|
63
|
+
context "without a version" do
|
64
|
+
after { migrator.apply }
|
65
|
+
|
66
|
+
it "applies all migrations in direct order" do
|
67
|
+
files.each do |path|
|
68
|
+
expect(runner_up)
|
69
|
+
.to receive(:apply)
|
70
|
+
.with(session, logger, path)
|
71
|
+
.ordered
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it "doesn't rollback migrations" do
|
76
|
+
expect(runner_down).not_to receive(:apply)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "with the zero version" do
|
81
|
+
after { migrator.apply version: 0 }
|
82
|
+
|
83
|
+
it "rolls back all migrations in reverse order" do
|
84
|
+
files.reverse_each do |path|
|
85
|
+
expect(runner_down)
|
86
|
+
.to receive(:apply)
|
87
|
+
.with(session, logger, path)
|
88
|
+
.ordered
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
it "doesn't apply migrations" do
|
93
|
+
expect(runner_up).not_to receive(:apply)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "with a non-zero version" do
|
98
|
+
after { migrator.apply version: 20160101000000 }
|
99
|
+
|
100
|
+
it "applies migrations up to the version in direct order" do
|
101
|
+
files[0..1].each do |path|
|
102
|
+
expect(runner_up)
|
103
|
+
.to receive(:apply)
|
104
|
+
.with(session, logger, path)
|
105
|
+
.ordered
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it "rolls back migrations with greater versions in reverse order" do
|
110
|
+
files[2..-1].reverse_each do |path|
|
111
|
+
expect(runner_down)
|
112
|
+
.to receive(:apply)
|
113
|
+
.with(session, logger, path)
|
114
|
+
.ordered
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end # describe #apply
|
119
|
+
|
120
|
+
end # describe ROM::Cassandra::Migrations::Migrator
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Migrations::RunnerDown do
|
4
|
+
|
5
|
+
let(:klass) { Class.new described_class }
|
6
|
+
let(:runner) { klass.new session, logger, path }
|
7
|
+
let(:session) { double :session, call: nil }
|
8
|
+
let(:logger) { double :logger, info: nil }
|
9
|
+
let(:path) { "foo/20150824103059_add_foo.rb" }
|
10
|
+
|
11
|
+
before do
|
12
|
+
klass.send(:define_method, :require) do |_|
|
13
|
+
AddFoo = Class.new(ROM::Cassandra::Migrations::Migration)
|
14
|
+
end
|
15
|
+
klass.send(:define_method, :select_version) { [{ id: 20150824103059 }] }
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#migrate?" do
|
19
|
+
subject { runner.migrate? }
|
20
|
+
|
21
|
+
context "when select_version isn't empty" do
|
22
|
+
it { is_expected.to eql true }
|
23
|
+
end
|
24
|
+
|
25
|
+
context "when select_version is empty" do
|
26
|
+
before { klass.send(:define_method, :select_version) { [] } }
|
27
|
+
|
28
|
+
it { is_expected.to eql false }
|
29
|
+
end
|
30
|
+
end # describe #migrate?
|
31
|
+
|
32
|
+
describe "#apply" do
|
33
|
+
after { runner.apply }
|
34
|
+
before { allow(runner).to receive(:migration) { migration } }
|
35
|
+
|
36
|
+
let(:migration) { double :migration, down: nil }
|
37
|
+
|
38
|
+
it "rolls back migration" do
|
39
|
+
expect(migration).to receive(:down).once
|
40
|
+
end
|
41
|
+
end # describe #apply
|
42
|
+
|
43
|
+
describe "#register" do
|
44
|
+
after { runner.register }
|
45
|
+
|
46
|
+
it "sends the DELETE query to session" do
|
47
|
+
expect(session)
|
48
|
+
.to receive(:call)
|
49
|
+
.with "DELETE FROM rom.migrations WHERE version = '20150824103059';"
|
50
|
+
end
|
51
|
+
end # describe #register
|
52
|
+
|
53
|
+
describe "#log" do
|
54
|
+
after { runner.log }
|
55
|
+
|
56
|
+
it "logs the message" do
|
57
|
+
expect(logger)
|
58
|
+
.to receive(:info)
|
59
|
+
.with "Roll back migration 20150824103059\n"
|
60
|
+
end
|
61
|
+
end # describe #log
|
62
|
+
|
63
|
+
after { Object.send :remove_const, :AddFoo if Object.const_defined? :AddFoo }
|
64
|
+
|
65
|
+
end # describe ROM::Cassandra::Migrations::RunnerDown
|
@@ -0,0 +1,142 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Migrations::Runner do
|
4
|
+
|
5
|
+
let(:klass) { Class.new described_class }
|
6
|
+
let(:runner) { klass.new session, logger, path }
|
7
|
+
let(:session) { double :session, call: nil }
|
8
|
+
let(:logger) { double :logger }
|
9
|
+
let(:path) { "foo/20150824103059_add_foo.rb" }
|
10
|
+
|
11
|
+
before do
|
12
|
+
klass.send(:define_method, :migrate?) { true }
|
13
|
+
klass.send(:define_method, :require) do |name|
|
14
|
+
AddFoo = Class.new(ROM::Cassandra::Migrations::Migration) if name == path
|
15
|
+
true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#session" do
|
20
|
+
subject { runner.session }
|
21
|
+
|
22
|
+
it { is_expected.to eql session }
|
23
|
+
end # describe #session
|
24
|
+
|
25
|
+
describe "#logger" do
|
26
|
+
subject { runner.logger }
|
27
|
+
|
28
|
+
it { is_expected.to eql logger }
|
29
|
+
end # describe #logger
|
30
|
+
|
31
|
+
describe "#path" do
|
32
|
+
subject { runner.path }
|
33
|
+
|
34
|
+
it { is_expected.to eql path }
|
35
|
+
end # describe #path
|
36
|
+
|
37
|
+
describe "#version" do
|
38
|
+
subject { runner.version }
|
39
|
+
|
40
|
+
context "from valid timestamp" do
|
41
|
+
let(:path) { "foo/12345678901234/20150824103059_add_foo.rb" }
|
42
|
+
|
43
|
+
it { is_expected.to eql 20150824103059 }
|
44
|
+
end
|
45
|
+
|
46
|
+
context "from invalid timestamp" do
|
47
|
+
let(:path) { "foo/2015082410305_add_foo.rb" }
|
48
|
+
|
49
|
+
it "fails" do
|
50
|
+
expect { subject }.to raise_error do |error|
|
51
|
+
expect(error).to be_kind_of NameError
|
52
|
+
expect(error.message)
|
53
|
+
.to eql("invalid version number: 'foo/2015082410305_add_foo.rb'")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end # describe #version
|
58
|
+
|
59
|
+
describe "#migration" do
|
60
|
+
subject { runner.migration }
|
61
|
+
|
62
|
+
it "creates migration for #session" do
|
63
|
+
expect(subject).to be_kind_of(AddFoo)
|
64
|
+
expect(subject.session).to eql(session)
|
65
|
+
end
|
66
|
+
|
67
|
+
context "when #migrate? is falsey" do
|
68
|
+
before { klass.send(:define_method, :migrate?) { nil } }
|
69
|
+
|
70
|
+
it { is_expected.to eql nil }
|
71
|
+
end
|
72
|
+
end # describe #migration
|
73
|
+
|
74
|
+
describe "#clear" do
|
75
|
+
subject { runner.clear }
|
76
|
+
|
77
|
+
before { runner }
|
78
|
+
end # describe #clear
|
79
|
+
|
80
|
+
describe "#call" do
|
81
|
+
before do
|
82
|
+
allow(runner).to receive(:apply)
|
83
|
+
allow(runner).to receive(:register)
|
84
|
+
allow(runner).to receive(:log)
|
85
|
+
end
|
86
|
+
|
87
|
+
subject { runner.call }
|
88
|
+
|
89
|
+
it "calls commands in the right order" do
|
90
|
+
expect(runner).to receive(:apply).ordered
|
91
|
+
expect(runner).to receive(:register).ordered
|
92
|
+
expect(runner).to receive(:log).ordered
|
93
|
+
subject
|
94
|
+
end
|
95
|
+
|
96
|
+
context "when #migration isn't set" do
|
97
|
+
before { allow(runner).to receive(:migration) }
|
98
|
+
|
99
|
+
it "skips all commands" do
|
100
|
+
expect(runner).not_to receive(:apply)
|
101
|
+
expect(runner).not_to receive(:register)
|
102
|
+
expect(runner).not_to receive(:log)
|
103
|
+
subject
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end # describe #call
|
107
|
+
|
108
|
+
describe "#select_version" do
|
109
|
+
after { runner.select_version }
|
110
|
+
|
111
|
+
let(:queries) do
|
112
|
+
[
|
113
|
+
"CREATE KEYSPACE IF NOT EXISTS rom WITH REPLICATION =" \
|
114
|
+
" {'class': 'SimpleStrategy', 'replication_factor': 3};",
|
115
|
+
"CREATE TABLE IF NOT EXISTS rom.migrations " \
|
116
|
+
"(version text, PRIMARY KEY (version));",
|
117
|
+
"SELECT * FROM rom.migrations WHERE version = '20150824103059';"
|
118
|
+
]
|
119
|
+
end
|
120
|
+
|
121
|
+
it "sends requests to Cassandra cluster" do
|
122
|
+
queries.each do |query|
|
123
|
+
expect(session).to receive(:call).with(query).ordered
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end # describe #select_version
|
127
|
+
|
128
|
+
describe ".apply" do
|
129
|
+
let(:runner) { double :runner, call: nil }
|
130
|
+
|
131
|
+
before { allow(described_class).to receive(:new) { runner } }
|
132
|
+
after { described_class.apply(session, logger, path) }
|
133
|
+
|
134
|
+
it "creates and calls the runner" do
|
135
|
+
expect(described_class).to receive(:new).with(session, logger, path)
|
136
|
+
expect(runner).to receive(:call)
|
137
|
+
end
|
138
|
+
end # describe .apply
|
139
|
+
|
140
|
+
after { Object.send :remove_const, :AddFoo if Object.const_defined? :AddFoo }
|
141
|
+
|
142
|
+
end # describe ROM::Cassandra::Migrations::Runner
|