From 3616162b75676cf2bd896fa63636689c4a5c1122 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Thu, 10 Dec 2015 01:24:23 +0300 Subject: [PATCH] specs refactoring --- devops-service/Guardfile | 3 ++- devops-service/db/validators/all.rb | 13 ++++----- .../spec/connectors/filter_connector_spec.rb | 2 -- .../spec/connectors/image_connector_spec.rb | 2 -- .../spec/connectors/key_connector_spec.rb | 2 -- .../spec/connectors/project_connector_spec.rb | 2 -- .../shared_connectors_specs.rb | 0 .../stack_template_connector_spec.rb | 2 -- .../models/deploy_env/deploy_env_ec2_spec.rb | 10 ++++--- .../deploy_env/deploy_env_openstack_spec.rb | 10 ++++--- .../deploy_env/deploy_env_static_spec.rb | 13 ++++++--- .../shared_cloud_deploy_env_specs.rb | 0 .../deploy_env}/shared_deploy_env_specs.rb | 27 +++++++++---------- devops-service/spec/models/project_spec.rb | 6 ++--- .../ec2_provider_account_spec.rb | 1 - .../openstack_provider_account_spec.rb | 1 - .../shared_validation_specs.rb | 0 .../shared_stack_template_specs.rb | 0 .../stack_template/stack_template_ec2_spec.rb | 2 +- .../auto_require_shared_specs.rb | 7 +++++ .../spec/shared_contexts/stubbed_connector.rb | 6 +++++ .../stubbed_env_validators.rb} | 17 +----------- .../spec/shared_contexts/stubbed_logger.rb | 7 +++++ .../with_tester_connector.rb} | 3 ++- devops-service/spec/spec_helper.rb | 1 + devops-service/spec/support/spec_support.rb | 2 +- 26 files changed, 70 insertions(+), 69 deletions(-) rename devops-service/spec/{support => connectors}/shared_connectors_specs.rb (100%) rename devops-service/spec/{support => models/deploy_env}/shared_cloud_deploy_env_specs.rb (100%) rename devops-service/spec/{support => models/deploy_env}/shared_deploy_env_specs.rb (89%) rename devops-service/spec/{support => models}/shared_validation_specs.rb (100%) rename devops-service/spec/{support => models/stack_template}/shared_stack_template_specs.rb (100%) create mode 100644 devops-service/spec/shared_contexts/auto_require_shared_specs.rb create mode 100644 devops-service/spec/shared_contexts/stubbed_connector.rb rename devops-service/spec/{models/shared_models_context.rb => shared_contexts/stubbed_env_validators.rb} (69%) create mode 100644 devops-service/spec/shared_contexts/stubbed_logger.rb rename devops-service/spec/{connectors/shared_connectors_context.rb => shared_contexts/with_tester_connector.rb} (85%) diff --git a/devops-service/Guardfile b/devops-service/Guardfile index 9248c74..13d5834 100644 --- a/devops-service/Guardfile +++ b/devops-service/Guardfile @@ -36,8 +36,9 @@ guard :rspec, cmd: "rspec" do watch(rspec.spec_support) { rspec.spec_dir } watch(rspec.spec_files) - # Factories files + # Spec config files watch(%r{spec/factories/.+\.rb}) { rspec.spec_dir } + watch(%r{spec/shared_contexts.+\.rb}) { rspec.spec_dir } # Devops files watch(%r{db/.+\.rb}) { rspec.spec_dir } diff --git a/devops-service/db/validators/all.rb b/devops-service/db/validators/all.rb index e64b6d0..c40f2f2 100644 --- a/devops-service/db/validators/all.rb +++ b/devops-service/db/validators/all.rb @@ -9,11 +9,12 @@ end require "db/validators/base" [ - 'db/validators/helpers/*.rb', - 'db/validators/deploy_env/*.rb', - 'db/validators/key/*.rb', - 'db/validators/image/*.rb', - 'db/validators/field_validators/*.rb' + 'helpers/*.rb', + 'deploy_env/*.rb', + 'key/*.rb', + 'image/*.rb', + 'field_validators/*.rb' ].each do |files_regexp| - Dir[File.join(Devops::Application.root, files_regexp)].each {|file| require file } + current_dir = File.dirname(__FILE__) + Dir[File.join(current_dir, files_regexp)].each {|file| require file } end diff --git a/devops-service/spec/connectors/filter_connector_spec.rb b/devops-service/spec/connectors/filter_connector_spec.rb index 2850835..6eb808d 100644 --- a/devops-service/spec/connectors/filter_connector_spec.rb +++ b/devops-service/spec/connectors/filter_connector_spec.rb @@ -1,10 +1,8 @@ require 'db/mongo/connectors/filter' require 'spec/connectors/tester_connector/filter' -require_relative 'shared_connectors_context' RSpec.describe Connectors::Filter, type: :connector do set_tester_connector TesterConnector::Filter - include_context 'connectors' let(:provider) {'ec2'} describe '#available_images' do diff --git a/devops-service/spec/connectors/image_connector_spec.rb b/devops-service/spec/connectors/image_connector_spec.rb index 585d728..31653f5 100644 --- a/devops-service/spec/connectors/image_connector_spec.rb +++ b/devops-service/spec/connectors/image_connector_spec.rb @@ -1,10 +1,8 @@ require 'db/mongo/connectors/image' require 'spec/connectors/tester_connector/image' -require_relative 'shared_connectors_context' RSpec.describe Connectors::Image, type: :connector do set_tester_connector TesterConnector::Image - include_context 'connectors' let(:model_class) { Devops::Model::Image } include_examples 'mongo connector', { diff --git a/devops-service/spec/connectors/key_connector_spec.rb b/devops-service/spec/connectors/key_connector_spec.rb index 9be46ee..ae64bf1 100644 --- a/devops-service/spec/connectors/key_connector_spec.rb +++ b/devops-service/spec/connectors/key_connector_spec.rb @@ -1,11 +1,9 @@ require 'db/mongo/connectors/key' require 'db/mongo/models/key' require 'spec/connectors/tester_connector/key' -require_relative 'shared_connectors_context' RSpec.describe Connectors::Key, type: :connector do set_tester_connector TesterConnector::Key - include_context 'connectors' let(:model_class) { Devops::Model::Key } include_examples 'mongo connector', model_name: :key, only: [:insert, :list] diff --git a/devops-service/spec/connectors/project_connector_spec.rb b/devops-service/spec/connectors/project_connector_spec.rb index 2b86bd8..b286a24 100644 --- a/devops-service/spec/connectors/project_connector_spec.rb +++ b/devops-service/spec/connectors/project_connector_spec.rb @@ -1,10 +1,8 @@ require 'db/mongo/connectors/project' require 'spec/connectors/tester_connector/project' -require_relative 'shared_connectors_context' RSpec.describe Connectors::Project, type: :connector do set_tester_connector TesterConnector::Project - include_context 'connectors' let(:model_class) { Devops::Model::Project } include_examples 'mongo connector', { diff --git a/devops-service/spec/support/shared_connectors_specs.rb b/devops-service/spec/connectors/shared_connectors_specs.rb similarity index 100% rename from devops-service/spec/support/shared_connectors_specs.rb rename to devops-service/spec/connectors/shared_connectors_specs.rb diff --git a/devops-service/spec/connectors/stack_template_connector_spec.rb b/devops-service/spec/connectors/stack_template_connector_spec.rb index edb9fe7..b0bc860 100644 --- a/devops-service/spec/connectors/stack_template_connector_spec.rb +++ b/devops-service/spec/connectors/stack_template_connector_spec.rb @@ -1,10 +1,8 @@ require 'db/mongo/connectors/stack_template' require 'spec/connectors/tester_connector/stack_template' -require_relative 'shared_connectors_context' RSpec.describe Connectors::StackTemplate, type: :connector do set_tester_connector TesterConnector::StackTemplate - include_context 'connectors' let(:model_class) { Devops::Model::StackTemplateEc2 } include_examples 'mongo connector', { diff --git a/devops-service/spec/models/deploy_env/deploy_env_ec2_spec.rb b/devops-service/spec/models/deploy_env/deploy_env_ec2_spec.rb index 2d3b2d8..8bbf1d0 100644 --- a/devops-service/spec/models/deploy_env/deploy_env_ec2_spec.rb +++ b/devops-service/spec/models/deploy_env/deploy_env_ec2_spec.rb @@ -1,12 +1,14 @@ require 'db/mongo/models/deploy_env/deploy_env_ec2' -require_relative '../shared_models_context' +require_relative 'shared_deploy_env_specs' +require_relative 'shared_cloud_deploy_env_specs' RSpec.describe Devops::Model::DeployEnvEc2, type: :model do let(:env) { build(:deploy_env_ec2) } - include_context 'stubbed calls to connector in env validators' - it_behaves_like 'deploy env' - it_behaves_like 'cloud deploy env' + describe 'it inherits from cloud deploy_env', stubbed_env_validators: true do + it_behaves_like 'deploy env' + it_behaves_like 'cloud deploy env' + end describe '#initialize' do it 'keep only first subnet in given array' do diff --git a/devops-service/spec/models/deploy_env/deploy_env_openstack_spec.rb b/devops-service/spec/models/deploy_env/deploy_env_openstack_spec.rb index 08783b6..e1a54de 100644 --- a/devops-service/spec/models/deploy_env/deploy_env_openstack_spec.rb +++ b/devops-service/spec/models/deploy_env/deploy_env_openstack_spec.rb @@ -1,12 +1,14 @@ require 'db/mongo/models/deploy_env/deploy_env_openstack' -require_relative '../shared_models_context' +require_relative 'shared_deploy_env_specs' +require_relative 'shared_cloud_deploy_env_specs' RSpec.describe Devops::Model::DeployEnvOpenstack, type: :model do let(:env) { build(:deploy_env_openstack) } - include_context 'stubbed calls to connector in env validators' - it_behaves_like 'deploy env' - it_behaves_like 'cloud deploy env' + describe 'it inherits from cloud deploy_env', stubbed_env_validators: true do + it_behaves_like 'deploy env' + it_behaves_like 'cloud deploy env' + end describe '.create' do it 'returns instance of DeployEnvOpenstack' do diff --git a/devops-service/spec/models/deploy_env/deploy_env_static_spec.rb b/devops-service/spec/models/deploy_env/deploy_env_static_spec.rb index 2f1d584..45ad446 100644 --- a/devops-service/spec/models/deploy_env/deploy_env_static_spec.rb +++ b/devops-service/spec/models/deploy_env/deploy_env_static_spec.rb @@ -1,14 +1,19 @@ require 'db/mongo/models/deploy_env/deploy_env_static' +require_relative 'shared_deploy_env_specs' RSpec.describe Devops::Model::DeployEnvStatic, type: :model do let(:env) { build(:deploy_env_static) } - before do - allow(Provider::ProviderFactory).to receive(:providers).and_return(%w(static)) - allow_any_instance_of(Validators::Helpers::Users).to receive(:available_users).and_return(['root']) + + describe 'it inherits from deploy env', stubbed_logger: true do + before do + allow(Provider::ProviderFactory).to receive(:providers).and_return(%w(static)) + allow_any_instance_of(Validators::Helpers::Users).to receive(:available_users).and_return(['root']) + end + + it_behaves_like 'deploy env' end - it_behaves_like 'deploy env' describe '.create' do it 'returns instance of DeployEnvStatic' do diff --git a/devops-service/spec/support/shared_cloud_deploy_env_specs.rb b/devops-service/spec/models/deploy_env/shared_cloud_deploy_env_specs.rb similarity index 100% rename from devops-service/spec/support/shared_cloud_deploy_env_specs.rb rename to devops-service/spec/models/deploy_env/shared_cloud_deploy_env_specs.rb diff --git a/devops-service/spec/support/shared_deploy_env_specs.rb b/devops-service/spec/models/deploy_env/shared_deploy_env_specs.rb similarity index 89% rename from devops-service/spec/support/shared_deploy_env_specs.rb rename to devops-service/spec/models/deploy_env/shared_deploy_env_specs.rb index a23b1b6..538f838 100644 --- a/devops-service/spec/support/shared_deploy_env_specs.rb +++ b/devops-service/spec/models/deploy_env/shared_deploy_env_specs.rb @@ -1,9 +1,5 @@ -require 'core/devops-application' -require 'core/devops-db' - RSpec.shared_examples 'deploy env' do validated_model_name = described_class.name.demodulize.underscore - include SpecSupport it 'is valid with correct attrs' do expect(env).to be_valid @@ -81,11 +77,10 @@ RSpec.shared_examples 'deploy env' do end end - describe '#update_field' do + describe '#update_field', stubbed_connector: true do subject { env.update_field('project_name', 'run_list', ['role[asd]']) } before do - allow_message_expectations_on_nil - allow(Devops::Db.connector).to receive(:set_project_deploy_env_field) + allow(stubbed_connector).to receive(:set_project_deploy_env_field) end it 'validate it' do @@ -98,12 +93,13 @@ RSpec.shared_examples 'deploy env' do end it 'saves it' do - expect(Devops::Db.connector).to receive(:set_project_deploy_env_field).with('project_name', env.identifier, {'run_list' => ['role[asd]']}) + expected_args = ['project_name', env.identifier, {'run_list' => ['role[asd]']}] + expect(stubbed_connector).to receive(:set_project_deploy_env_field).with(*expected_args) subject end end - describe '#create_role', stub_logger: true do + describe '#create_role', stubbed_logger: true do subject { env.create_role('project_name') } before do allow(env).to receive_message_chain('knife_instance.role_name') { 'role_name' } @@ -152,7 +148,7 @@ RSpec.shared_examples 'deploy env' do end end - describe '#rename', stub_logger: true do + describe '#rename', stubbed_logger: true do subject { env.rename('project_id', 'new_name') } let(:old_role_name) {'project_id_name'} let(:new_role_name) {'project_id_new_name'} @@ -174,15 +170,16 @@ RSpec.shared_examples 'deploy env' do stub_const('Devops::Model::Project', project_class_double) end - it 'raises InvalidRecord if env with such name already exists in project' do - allow(Devops::Db.connector).to receive_message_chain('project.deploy_env') + it 'raises InvalidRecord if env with such name already exists in project', stubbed_connector: true do + project = build(:project, with_deploy_env_identifiers: %w(new_name)) + allow(stubbed_connector).to receive(:project) { project } expect{subject}.to raise_error(InvalidRecord) end - context 'when there is no env with such name already' do + context 'when there is no env with such name already', stubbed_connector: true do before do - allow(Devops::Db.connector).to receive_message_chain('project.deploy_env') {raise RecordNotFound} - allow(Devops::Db.connector).to receive(:set_project_deploy_env_field) + allow(stubbed_connector).to receive(:project) { build(:project) } + allow(stubbed_connector).to receive(:set_project_deploy_env_field) end it 'validates new identifier' do diff --git a/devops-service/spec/models/project_spec.rb b/devops-service/spec/models/project_spec.rb index f150081..dd892b1 100644 --- a/devops-service/spec/models/project_spec.rb +++ b/devops-service/spec/models/project_spec.rb @@ -1,11 +1,9 @@ require 'db/mongo/models/project' -require_relative 'shared_models_context' RSpec.describe Devops::Model::Project, type: :model do let(:project) { build(:project) } - include_context 'stubbed calls to connector in env validators' - describe 'validation rules:' do + describe 'validation rules:', stubbed_env_validators: true do include_examples 'field type validation', :id, :not_nil, :non_empty_string include_examples 'field type validation', :deploy_envs, :not_nil, :non_empty_array include_examples 'field type validation', :description, :maybe_nil, :maybe_empty_string @@ -90,7 +88,7 @@ RSpec.describe Devops::Model::Project, type: :model do end end - describe '#add_deploy_env', stub_logger: true do + describe '#add_deploy_env', stubbed_logger: true do let(:env) {build(:deploy_env_ec2)} subject { project.add_deploy_env(env) } before do diff --git a/devops-service/spec/models/provider_account/ec2_provider_account_spec.rb b/devops-service/spec/models/provider_account/ec2_provider_account_spec.rb index 2d9c33f..8145ea0 100644 --- a/devops-service/spec/models/provider_account/ec2_provider_account_spec.rb +++ b/devops-service/spec/models/provider_account/ec2_provider_account_spec.rb @@ -1,5 +1,4 @@ require 'spec_helper' -require_relative '../shared_models_context' RSpec.describe Devops::Model::Ec2ProviderAccount, type: :model do let(:provider_account) { build(:ec2_provider_account) } diff --git a/devops-service/spec/models/provider_account/openstack_provider_account_spec.rb b/devops-service/spec/models/provider_account/openstack_provider_account_spec.rb index 18456eb..e601778 100644 --- a/devops-service/spec/models/provider_account/openstack_provider_account_spec.rb +++ b/devops-service/spec/models/provider_account/openstack_provider_account_spec.rb @@ -1,5 +1,4 @@ require 'spec_helper' -require_relative '../shared_models_context' # не пытайся выделить в shared_specs, фигня выйдет RSpec.describe Devops::Model::OpenstackProviderAccount, type: :model do diff --git a/devops-service/spec/support/shared_validation_specs.rb b/devops-service/spec/models/shared_validation_specs.rb similarity index 100% rename from devops-service/spec/support/shared_validation_specs.rb rename to devops-service/spec/models/shared_validation_specs.rb diff --git a/devops-service/spec/support/shared_stack_template_specs.rb b/devops-service/spec/models/stack_template/shared_stack_template_specs.rb similarity index 100% rename from devops-service/spec/support/shared_stack_template_specs.rb rename to devops-service/spec/models/stack_template/shared_stack_template_specs.rb diff --git a/devops-service/spec/models/stack_template/stack_template_ec2_spec.rb b/devops-service/spec/models/stack_template/stack_template_ec2_spec.rb index 1cb48af..02c4d03 100644 --- a/devops-service/spec/models/stack_template/stack_template_ec2_spec.rb +++ b/devops-service/spec/models/stack_template/stack_template_ec2_spec.rb @@ -1,4 +1,5 @@ require 'db/mongo/models/stack_template/stack_template_ec2' +require_relative 'shared_stack_template_specs' RSpec.describe Devops::Model::StackTemplateEc2, type: :model do let(:stack_template) { build(:stack_template_ec2) } @@ -9,5 +10,4 @@ RSpec.describe Devops::Model::StackTemplateEc2, type: :model do end it_behaves_like 'stack template' - end \ No newline at end of file diff --git a/devops-service/spec/shared_contexts/auto_require_shared_specs.rb b/devops-service/spec/shared_contexts/auto_require_shared_specs.rb new file mode 100644 index 0000000..eeabd9a --- /dev/null +++ b/devops-service/spec/shared_contexts/auto_require_shared_specs.rb @@ -0,0 +1,7 @@ +RSpec.shared_context 'auto_model', type: :model do + require 'spec/models/shared_validation_specs' +end + +RSpec.shared_context 'auto_connector', type: :connector do + require 'spec/connectors/shared_connectors_specs' +end \ No newline at end of file diff --git a/devops-service/spec/shared_contexts/stubbed_connector.rb b/devops-service/spec/shared_contexts/stubbed_connector.rb new file mode 100644 index 0000000..7d6dabb --- /dev/null +++ b/devops-service/spec/shared_contexts/stubbed_connector.rb @@ -0,0 +1,6 @@ +RSpec.shared_context 'stubbed calls to connector', stubbed_connector: true do + let(:stubbed_connector) { double() } + before do + allow(Devops::Db).to receive(:connector) { stubbed_connector } + end +end \ No newline at end of file diff --git a/devops-service/spec/models/shared_models_context.rb b/devops-service/spec/shared_contexts/stubbed_env_validators.rb similarity index 69% rename from devops-service/spec/models/shared_models_context.rb rename to devops-service/spec/shared_contexts/stubbed_env_validators.rb index a0f1fa6..69f081c 100644 --- a/devops-service/spec/models/shared_models_context.rb +++ b/devops-service/spec/shared_contexts/stubbed_env_validators.rb @@ -1,4 +1,4 @@ -RSpec.shared_context 'stubbed calls to connector in env validators' do +RSpec.shared_context 'stubbed calls to connector in env validators', stubbed_env_validators: true do before do allow(Provider::ProviderFactory).to receive(:providers).and_return(%w(ec2 openstack)) allow_any_instance_of(Validators::Helpers::Users).to receive(:available_users).and_return(['root']) @@ -10,19 +10,4 @@ RSpec.shared_context 'stubbed calls to connector in env validators' do allow_any_instance_of(Validators::DeployEnv::StackTemplate).to receive(:available_stack_templates).and_return([{'id' => 'template'}]) allow_any_instance_of(Validators::FieldValidator::Image).to receive(:available_images).and_return([{'id' => 'image'}]) end -end - -RSpec.shared_context 'stubbed calls to logger', stub_logger: true do - before do - allow(DevopsLogger).to receive_message_chain('logger.debug') - allow(DevopsLogger).to receive_message_chain('logger.info') - allow(DevopsLogger).to receive_message_chain('logger.error') - end -end - -RSpec.shared_context 'stubbed calls to connector', stubbed_connector: true do - let(:stubbed_connector) { double() } - before do - allow(Devops::Db).to receive(:connector) { stubbed_connector } - end end \ No newline at end of file diff --git a/devops-service/spec/shared_contexts/stubbed_logger.rb b/devops-service/spec/shared_contexts/stubbed_logger.rb new file mode 100644 index 0000000..f2d79e9 --- /dev/null +++ b/devops-service/spec/shared_contexts/stubbed_logger.rb @@ -0,0 +1,7 @@ +RSpec.shared_context 'stubbed calls to logger', stubbed_logger: true do + before do + allow(DevopsLogger).to receive_message_chain('logger.debug') + allow(DevopsLogger).to receive_message_chain('logger.info') + allow(DevopsLogger).to receive_message_chain('logger.error') + end +end \ No newline at end of file diff --git a/devops-service/spec/connectors/shared_connectors_context.rb b/devops-service/spec/shared_contexts/with_tester_connector.rb similarity index 85% rename from devops-service/spec/connectors/shared_connectors_context.rb rename to devops-service/spec/shared_contexts/with_tester_connector.rb index 3c0fedb..8bb586e 100644 --- a/devops-service/spec/connectors/shared_connectors_context.rb +++ b/devops-service/spec/shared_contexts/with_tester_connector.rb @@ -2,9 +2,10 @@ def set_tester_connector(klass) define_method :tester_connector_class do klass end + include_context 'with tester connector' end -RSpec.shared_context 'connectors' do +RSpec.shared_context 'with tester connector' do before(:all) do @connector = described_class.new(SpecSupport.db) @tester_connector = tester_connector_class.new diff --git a/devops-service/spec/spec_helper.rb b/devops-service/spec/spec_helper.rb index ac74d92..9f2500f 100644 --- a/devops-service/spec/spec_helper.rb +++ b/devops-service/spec/spec_helper.rb @@ -13,6 +13,7 @@ original_stdout = $stdout $stdout = File.open(File::NULL, "w") Dir[("./spec/support/**/*.rb")].each { |f| require f } +Dir[("./spec/shared_contexts/**/*.rb")].each { |f| require f } # Factory girl configuration FactoryGirl.define do diff --git a/devops-service/spec/support/spec_support.rb b/devops-service/spec/support/spec_support.rb index 14a684a..ab47bc6 100644 --- a/devops-service/spec/support/spec_support.rb +++ b/devops-service/spec/support/spec_support.rb @@ -5,7 +5,7 @@ module SpecSupport BLANK_FILE = File.join(ROOT, 'spec/support/blank_file') def self.db_params - @db ||= begin + @db_params ||= begin conf = config['mongo'] db_name = conf.fetch(:db) [db_name, conf[:host], conf[:port], conf[:user], conf[:password]]