specs refactoring

This commit is contained in:
Anton Chuchkalov 2015-12-10 01:24:23 +03:00
parent e70ff0b832
commit 3616162b75
26 changed files with 70 additions and 69 deletions

View File

@ -36,8 +36,9 @@ guard :rspec, cmd: "rspec" do
watch(rspec.spec_support) { rspec.spec_dir } watch(rspec.spec_support) { rspec.spec_dir }
watch(rspec.spec_files) watch(rspec.spec_files)
# Factories files # Spec config files
watch(%r{spec/factories/.+\.rb}) { rspec.spec_dir } watch(%r{spec/factories/.+\.rb}) { rspec.spec_dir }
watch(%r{spec/shared_contexts.+\.rb}) { rspec.spec_dir }
# Devops files # Devops files
watch(%r{db/.+\.rb}) { rspec.spec_dir } watch(%r{db/.+\.rb}) { rspec.spec_dir }

View File

@ -9,11 +9,12 @@ end
require "db/validators/base" require "db/validators/base"
[ [
'db/validators/helpers/*.rb', 'helpers/*.rb',
'db/validators/deploy_env/*.rb', 'deploy_env/*.rb',
'db/validators/key/*.rb', 'key/*.rb',
'db/validators/image/*.rb', 'image/*.rb',
'db/validators/field_validators/*.rb' 'field_validators/*.rb'
].each do |files_regexp| ].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 end

View File

@ -1,10 +1,8 @@
require 'db/mongo/connectors/filter' require 'db/mongo/connectors/filter'
require 'spec/connectors/tester_connector/filter' require 'spec/connectors/tester_connector/filter'
require_relative 'shared_connectors_context'
RSpec.describe Connectors::Filter, type: :connector do RSpec.describe Connectors::Filter, type: :connector do
set_tester_connector TesterConnector::Filter set_tester_connector TesterConnector::Filter
include_context 'connectors'
let(:provider) {'ec2'} let(:provider) {'ec2'}
describe '#available_images' do describe '#available_images' do

View File

@ -1,10 +1,8 @@
require 'db/mongo/connectors/image' require 'db/mongo/connectors/image'
require 'spec/connectors/tester_connector/image' require 'spec/connectors/tester_connector/image'
require_relative 'shared_connectors_context'
RSpec.describe Connectors::Image, type: :connector do RSpec.describe Connectors::Image, type: :connector do
set_tester_connector TesterConnector::Image set_tester_connector TesterConnector::Image
include_context 'connectors'
let(:model_class) { Devops::Model::Image } let(:model_class) { Devops::Model::Image }
include_examples 'mongo connector', { include_examples 'mongo connector', {

View File

@ -1,11 +1,9 @@
require 'db/mongo/connectors/key' require 'db/mongo/connectors/key'
require 'db/mongo/models/key' require 'db/mongo/models/key'
require 'spec/connectors/tester_connector/key' require 'spec/connectors/tester_connector/key'
require_relative 'shared_connectors_context'
RSpec.describe Connectors::Key, type: :connector do RSpec.describe Connectors::Key, type: :connector do
set_tester_connector TesterConnector::Key set_tester_connector TesterConnector::Key
include_context 'connectors'
let(:model_class) { Devops::Model::Key } let(:model_class) { Devops::Model::Key }
include_examples 'mongo connector', model_name: :key, only: [:insert, :list] include_examples 'mongo connector', model_name: :key, only: [:insert, :list]

View File

@ -1,10 +1,8 @@
require 'db/mongo/connectors/project' require 'db/mongo/connectors/project'
require 'spec/connectors/tester_connector/project' require 'spec/connectors/tester_connector/project'
require_relative 'shared_connectors_context'
RSpec.describe Connectors::Project, type: :connector do RSpec.describe Connectors::Project, type: :connector do
set_tester_connector TesterConnector::Project set_tester_connector TesterConnector::Project
include_context 'connectors'
let(:model_class) { Devops::Model::Project } let(:model_class) { Devops::Model::Project }
include_examples 'mongo connector', { include_examples 'mongo connector', {

View File

@ -1,10 +1,8 @@
require 'db/mongo/connectors/stack_template' require 'db/mongo/connectors/stack_template'
require 'spec/connectors/tester_connector/stack_template' require 'spec/connectors/tester_connector/stack_template'
require_relative 'shared_connectors_context'
RSpec.describe Connectors::StackTemplate, type: :connector do RSpec.describe Connectors::StackTemplate, type: :connector do
set_tester_connector TesterConnector::StackTemplate set_tester_connector TesterConnector::StackTemplate
include_context 'connectors'
let(:model_class) { Devops::Model::StackTemplateEc2 } let(:model_class) { Devops::Model::StackTemplateEc2 }
include_examples 'mongo connector', { include_examples 'mongo connector', {

View File

@ -1,12 +1,14 @@
require 'db/mongo/models/deploy_env/deploy_env_ec2' 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 RSpec.describe Devops::Model::DeployEnvEc2, type: :model do
let(:env) { build(:deploy_env_ec2) } let(:env) { build(:deploy_env_ec2) }
include_context 'stubbed calls to connector in env validators'
it_behaves_like 'deploy env' describe 'it inherits from cloud deploy_env', stubbed_env_validators: true do
it_behaves_like 'cloud deploy env' it_behaves_like 'deploy env'
it_behaves_like 'cloud deploy env'
end
describe '#initialize' do describe '#initialize' do
it 'keep only first subnet in given array' do it 'keep only first subnet in given array' do

View File

@ -1,12 +1,14 @@
require 'db/mongo/models/deploy_env/deploy_env_openstack' 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 RSpec.describe Devops::Model::DeployEnvOpenstack, type: :model do
let(:env) { build(:deploy_env_openstack) } let(:env) { build(:deploy_env_openstack) }
include_context 'stubbed calls to connector in env validators'
it_behaves_like 'deploy env' describe 'it inherits from cloud deploy_env', stubbed_env_validators: true do
it_behaves_like 'cloud deploy env' it_behaves_like 'deploy env'
it_behaves_like 'cloud deploy env'
end
describe '.create' do describe '.create' do
it 'returns instance of DeployEnvOpenstack' do it 'returns instance of DeployEnvOpenstack' do

View File

@ -1,14 +1,19 @@
require 'db/mongo/models/deploy_env/deploy_env_static' require 'db/mongo/models/deploy_env/deploy_env_static'
require_relative 'shared_deploy_env_specs'
RSpec.describe Devops::Model::DeployEnvStatic, type: :model do RSpec.describe Devops::Model::DeployEnvStatic, type: :model do
let(:env) { build(:deploy_env_static) } let(:env) { build(:deploy_env_static) }
before do
allow(Provider::ProviderFactory).to receive(:providers).and_return(%w(static)) describe 'it inherits from deploy env', stubbed_logger: true do
allow_any_instance_of(Validators::Helpers::Users).to receive(:available_users).and_return(['root']) 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 end
it_behaves_like 'deploy env'
describe '.create' do describe '.create' do
it 'returns instance of DeployEnvStatic' do it 'returns instance of DeployEnvStatic' do

View File

@ -1,9 +1,5 @@
require 'core/devops-application'
require 'core/devops-db'
RSpec.shared_examples 'deploy env' do RSpec.shared_examples 'deploy env' do
validated_model_name = described_class.name.demodulize.underscore validated_model_name = described_class.name.demodulize.underscore
include SpecSupport
it 'is valid with correct attrs' do it 'is valid with correct attrs' do
expect(env).to be_valid expect(env).to be_valid
@ -81,11 +77,10 @@ RSpec.shared_examples 'deploy env' do
end end
end end
describe '#update_field' do describe '#update_field', stubbed_connector: true do
subject { env.update_field('project_name', 'run_list', ['role[asd]']) } subject { env.update_field('project_name', 'run_list', ['role[asd]']) }
before do before do
allow_message_expectations_on_nil allow(stubbed_connector).to receive(:set_project_deploy_env_field)
allow(Devops::Db.connector).to receive(:set_project_deploy_env_field)
end end
it 'validate it' do it 'validate it' do
@ -98,12 +93,13 @@ RSpec.shared_examples 'deploy env' do
end end
it 'saves it' do 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 subject
end end
end end
describe '#create_role', stub_logger: true do describe '#create_role', stubbed_logger: true do
subject { env.create_role('project_name') } subject { env.create_role('project_name') }
before do before do
allow(env).to receive_message_chain('knife_instance.role_name') { 'role_name' } allow(env).to receive_message_chain('knife_instance.role_name') { 'role_name' }
@ -152,7 +148,7 @@ RSpec.shared_examples 'deploy env' do
end end
end end
describe '#rename', stub_logger: true do describe '#rename', stubbed_logger: true do
subject { env.rename('project_id', 'new_name') } subject { env.rename('project_id', 'new_name') }
let(:old_role_name) {'project_id_name'} let(:old_role_name) {'project_id_name'}
let(:new_role_name) {'project_id_new_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) stub_const('Devops::Model::Project', project_class_double)
end end
it 'raises InvalidRecord if env with such name already exists in project' do it 'raises InvalidRecord if env with such name already exists in project', stubbed_connector: true do
allow(Devops::Db.connector).to receive_message_chain('project.deploy_env') project = build(:project, with_deploy_env_identifiers: %w(new_name))
allow(stubbed_connector).to receive(:project) { project }
expect{subject}.to raise_error(InvalidRecord) expect{subject}.to raise_error(InvalidRecord)
end 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 before do
allow(Devops::Db.connector).to receive_message_chain('project.deploy_env') {raise RecordNotFound} allow(stubbed_connector).to receive(:project) { build(:project) }
allow(Devops::Db.connector).to receive(:set_project_deploy_env_field) allow(stubbed_connector).to receive(:set_project_deploy_env_field)
end end
it 'validates new identifier' do it 'validates new identifier' do

View File

@ -1,11 +1,9 @@
require 'db/mongo/models/project' require 'db/mongo/models/project'
require_relative 'shared_models_context'
RSpec.describe Devops::Model::Project, type: :model do RSpec.describe Devops::Model::Project, type: :model do
let(:project) { build(:project) } 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', :id, :not_nil, :non_empty_string
include_examples 'field type validation', :deploy_envs, :not_nil, :non_empty_array include_examples 'field type validation', :deploy_envs, :not_nil, :non_empty_array
include_examples 'field type validation', :description, :maybe_nil, :maybe_empty_string 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
end end
describe '#add_deploy_env', stub_logger: true do describe '#add_deploy_env', stubbed_logger: true do
let(:env) {build(:deploy_env_ec2)} let(:env) {build(:deploy_env_ec2)}
subject { project.add_deploy_env(env) } subject { project.add_deploy_env(env) }
before do before do

View File

@ -1,5 +1,4 @@
require 'spec_helper' require 'spec_helper'
require_relative '../shared_models_context'
RSpec.describe Devops::Model::Ec2ProviderAccount, type: :model do RSpec.describe Devops::Model::Ec2ProviderAccount, type: :model do
let(:provider_account) { build(:ec2_provider_account) } let(:provider_account) { build(:ec2_provider_account) }

View File

@ -1,5 +1,4 @@
require 'spec_helper' require 'spec_helper'
require_relative '../shared_models_context'
# не пытайся выделить в shared_specs, фигня выйдет # не пытайся выделить в shared_specs, фигня выйдет
RSpec.describe Devops::Model::OpenstackProviderAccount, type: :model do RSpec.describe Devops::Model::OpenstackProviderAccount, type: :model do

View File

@ -1,4 +1,5 @@
require 'db/mongo/models/stack_template/stack_template_ec2' require 'db/mongo/models/stack_template/stack_template_ec2'
require_relative 'shared_stack_template_specs'
RSpec.describe Devops::Model::StackTemplateEc2, type: :model do RSpec.describe Devops::Model::StackTemplateEc2, type: :model do
let(:stack_template) { build(:stack_template_ec2) } let(:stack_template) { build(:stack_template_ec2) }
@ -9,5 +10,4 @@ RSpec.describe Devops::Model::StackTemplateEc2, type: :model do
end end
it_behaves_like 'stack template' it_behaves_like 'stack template'
end end

View File

@ -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

View File

@ -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

View File

@ -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 before do
allow(Provider::ProviderFactory).to receive(:providers).and_return(%w(ec2 openstack)) 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']) allow_any_instance_of(Validators::Helpers::Users).to receive(:available_users).and_return(['root'])
@ -11,18 +11,3 @@ RSpec.shared_context 'stubbed calls to connector in env validators' do
allow_any_instance_of(Validators::FieldValidator::Image).to receive(:available_images).and_return([{'id' => 'image'}]) allow_any_instance_of(Validators::FieldValidator::Image).to receive(:available_images).and_return([{'id' => 'image'}])
end end
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

View File

@ -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

View File

@ -2,9 +2,10 @@ def set_tester_connector(klass)
define_method :tester_connector_class do define_method :tester_connector_class do
klass klass
end end
include_context 'with tester connector'
end end
RSpec.shared_context 'connectors' do RSpec.shared_context 'with tester connector' do
before(:all) do before(:all) do
@connector = described_class.new(SpecSupport.db) @connector = described_class.new(SpecSupport.db)
@tester_connector = tester_connector_class.new @tester_connector = tester_connector_class.new

View File

@ -13,6 +13,7 @@ original_stdout = $stdout
$stdout = File.open(File::NULL, "w") $stdout = File.open(File::NULL, "w")
Dir[("./spec/support/**/*.rb")].each { |f| require f } Dir[("./spec/support/**/*.rb")].each { |f| require f }
Dir[("./spec/shared_contexts/**/*.rb")].each { |f| require f }
# Factory girl configuration # Factory girl configuration
FactoryGirl.define do FactoryGirl.define do

View File

@ -5,7 +5,7 @@ module SpecSupport
BLANK_FILE = File.join(ROOT, 'spec/support/blank_file') BLANK_FILE = File.join(ROOT, 'spec/support/blank_file')
def self.db_params def self.db_params
@db ||= begin @db_params ||= begin
conf = config['mongo'] conf = config['mongo']
db_name = conf.fetch(:db) db_name = conf.fetch(:db)
[db_name, conf[:host], conf[:port], conf[:user], conf[:password]] [db_name, conf[:host], conf[:port], conf[:user], conf[:password]]