spec/unit/utils/migrate_spec.rb in couchrest_model-2.2.0.beta1 vs spec/unit/utils/migrate_spec.rb in couchrest_model-2.2.0.beta2
- old
+ new
@@ -1,18 +1,49 @@
-
require 'spec_helper'
+class MigrateModel < CouchRest::Model::Base
+ use_database :migrations
+ proxy_database_method :id
+ proxy_for :migrate_proxy_models
+ property :name
+ property :value
+ design { view :by_name }
+end
+
+class MigrateProxyModel < CouchRest::Model::Base
+ proxied_by :migrate_model
+ proxy_database_method :id
+ proxy_for :migrate_proxy_nested_models
+ property :name
+ property :value
+ design { view :by_name }
+end
+
+class MigrateProxyNestedModel < CouchRest::Model::Base
+ proxied_by :migrate_proxy_model
+ property :name
+ property :value
+ design { view :by_name }
+end
+
+RSpec::Matchers.define :database_matching do |database|
+ match do |actual|
+ actual.server == database.server && actual.name == database.name
+ end
+end
+
describe CouchRest::Model::Utils::Migrate do
before :each do
@module = CouchRest::Model::Utils::Migrate
end
describe "#load_all_models" do
it "should not do anything if Rails is not available" do
@module.load_all_models
end
+
it "should detect if Rails is available and require models" do
Rails = double()
allow(Rails).to receive(:root).and_return("")
expect(Dir).to receive(:[]).with("app/models/**/*.rb").and_return(['failed_require'])
# we can't double require, so just expect an error
@@ -20,6 +51,110 @@
@module.load_all_models
}.to raise_error(LoadError)
end
end
+ describe "migrations" do
+ let!(:stdout) { $stdout }
+ before :each do
+ allow(CouchRest::Model::Base).to receive(:subclasses).and_return([MigrateModel, MigrateProxyModel, MigrateProxyNestedModel])
+ $stdout = StringIO.new
+ end
+
+ after :each do
+ $stdout = stdout
+ end
+
+ describe "#all_models" do
+ it "should migrate root subclasses of CouchRest::Model::Base" do
+ expect(MigrateModel.design_docs.first).to receive(:migrate)
+ @module.all_models
+ end
+
+ it "shouldn't migrate proxied subclasses with of CouchRest::Model::Base" do
+ expect(MigrateProxyModel.design_docs.first).not_to receive(:migrate)
+ expect(MigrateProxyNestedModel.design_docs.first).not_to receive(:migrate)
+ @module.all_models
+ end
+
+ context "migration design docs" do
+ before :each do
+ @module.all_models
+ @design_doc = MigrateModel.design_doc
+ end
+
+ it "shouldn't modify the original design doc if activate is false" do
+ @design_doc.create_view(:by_name_and_id)
+ @module.all_models(activate: false)
+
+ fetched_ddoc = MigrateModel.get(@design_doc.id)
+ expect(fetched_ddoc['views']).not_to have_key('by_name_and_id')
+ end
+
+ it "should remove a leftover migration doc" do
+ @design_doc.create_view(:by_name_and_value)
+ @module.all_models(activate: false)
+
+ expect(MigrateModel.get("#{@design_doc.id}_migration")).not_to be_nil
+ @module.all_models
+ expect(MigrateModel.get("#{@design_doc.id}_migration")).to be_nil
+ end
+ end
+ end
+
+ describe "#all_models_and_proxies" do
+ before :each do
+ # clear data from previous test runs
+ MigrateModel.all.each do |mm|
+ next if mm.nil?
+ mm.migrate_proxy_models.all.each do |mpm|
+ mpm.migrate_proxy_nested_models.database.delete! rescue nil
+ end rescue nil
+ mm.migrate_proxy_models.database.delete!
+ mm.destroy rescue nil
+ end
+ MigrateModel.database.recreate!
+ end
+
+ it "should migrate first level proxied subclasses of CouchRest::Model::Base" do
+ mm = MigrateModel.new(name: "Migration").save
+ expect(MigrateProxyModel.design_docs.first).to receive(:migrate).with(database_matching(mm.migrate_proxy_models.database)).and_call_original
+ @module.all_models_and_proxies
+ end
+
+ it "should migrate the second level proxied subclasses of CouchRest::Model::Base" do
+ mm = MigrateModel.new(name: "Migration").save
+ mpm = mm.migrate_proxy_models.new(name: "Migration Proxy").save
+ expect(MigrateProxyNestedModel.design_docs.first).to receive(:migrate).with(database_matching(mpm.migrate_proxy_nested_models.database))
+ @module.all_models_and_proxies
+ end
+
+ context "migration design docs" do
+ before :each do
+ @mm_instance = MigrateModel.new(name: "Migration").save
+ mpm = @mm_instance.migrate_proxy_models.new(name: "Migration Proxy")
+
+ @module.all_models_and_proxies
+
+ @design_doc = MigrateProxyModel.design_doc
+ end
+
+ it "shouldn't modify the original design doc if activate is false" do
+ @design_doc.create_view(:by_name_and_id)
+ @module.all_models_and_proxies(activate: false)
+
+ fetched_ddoc = @mm_instance.migrate_proxy_models.get(@design_doc.id)
+ expect(fetched_ddoc['views']).not_to have_key('by_name_and_id')
+ end
+
+ it "should remove a leftover migration doc" do
+ @design_doc.create_view(:by_name_and_value)
+ @module.all_models_and_proxies(activate: false)
+
+ expect(@mm_instance.migrate_proxy_models.get("#{@design_doc.id}_migration")).not_to be_nil
+ @module.all_models_and_proxies
+ expect(@mm_instance.migrate_proxy_models.get("#{@design_doc.id}_migration")).to be_nil
+ end
+ end
+ end
+ end
end