class Pretentious::RspecGenerator
Generator
for RSPEC
Public Class Methods
to_sym()
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 4 def self.to_sym :spec end
Private Class Methods
helper(output_folder)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 194 def self.helper(output_folder) filename = File.join(output_folder, 'spec_helper.rb') unless File.exist?(filename) File.open(filename, 'w') { |f| f.write('# Place your requires here') } puts "#{filename}" end end
location(output_folder)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 184 def self.location(output_folder) output_folder.nil? ? 'spec' : File.join(output_folder, 'spec') end
naming(output_folder, klass)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 188 def self.naming(output_folder, klass) klass_name_parts = klass.name.split('::') last_part = klass_name_parts.pop File.join(output_folder, "#{Pretentious::DdtUtils.to_underscore(last_part)}_spec.rb") end
Public Instance Methods
begin_spec(test_class)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 8 def begin_spec(test_class) buffer('# This file was automatically generated by the pretentious gem') buffer("require 'spec_helper'") whitespace buffer("RSpec.describe #{test_class.name} do") end
end_spec()
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 15 def end_spec buffer('end') end
output()
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 19 def output @output_buffer end
Private Instance Methods
generate(test_instance, instance_count)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 25 def generate(test_instance, instance_count) output_buffer = '' if test_instance.is_a? Class context = Pretentious::Context.new(test_instance.let_variables) # class methods class_method_calls = test_instance.method_calls_by_method buffer_inline_to_string(output_buffer, generate_specs(0, context, "#{test_instance.test_class.name}::", test_instance.test_class.name, class_method_calls)) else buffer_to_string(output_buffer, "context 'Scenario #{instance_count}' do", 1) buffer_to_string(output_buffer, 'before do', 2) context, declarations = setup_fixture(test_instance) method_calls = test_instance.method_calls_by_method spec_context = context.subcontext(declarations[:declaration]) specs_buffer = generate_specs(1, spec_context, "#{test_instance.test_class.name}#", "@fixture", method_calls) context.declared_names = {} deconstruct_output = @deconstructor.build_output(context, 3 * @_indentation.length, declarations) buffer_inline_to_string(output_buffer, deconstruct_output) buffer_to_string(output_buffer, 'end', 2) buffer_to_string(output_buffer, '') buffer_inline_to_string(output_buffer, specs_buffer) buffer_to_string(output_buffer, 'end', 1) end output_buffer end
generate_expectation(indentation_level, context, fixture, method, params, block, result)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 62 def generate_expectation(indentation_level, context, fixture, method, params, block, result) output = '' block_source = if !block.nil? && block.is_a?(Pretentious::RecordedProc) get_block_source(context, block) else '' end statement = if params.size > 0 "#{fixture}.#{prettify_method_name(method)}(#{params_generator(context, params)})#{block_source}" else stmt = [] stmt << "#{fixture}.#{method}" stmt << "#{block_source}" unless block_source.empty? stmt.join(' ') end if result.is_a? Exception buffer_to_string(output, "expect { #{statement} }.to #{pick_matcher(context, result)}", indentation_level + 2) else buffer_to_string(output, "expect(#{statement}).to #{pick_matcher(context, result)}", indentation_level + 2) end output end
generate_rspec_stub(context, mocks_collection, indentation_level)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 152 def generate_rspec_stub(context, mocks_collection, indentation_level) indentation = '' indentation_level.times { indentation << ' ' } str = '' mocks_collection.each do |_k, values| vals = values.collect { |v| context.value_of(v[:result]) } # check if all vals are the same and just use one vals = [vals[0]] if vals.uniq.size == 1 str << "#{indentation}allow_any_instance_of(#{values[0][:class]}).to receive(:#{values[0][:method]}).and_return(#{vals.join(', ')})\n" end str end
generate_specs(indentation_level, context, context_prefix, fixture, method_calls)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 87 def generate_specs(indentation_level, context, context_prefix, fixture, method_calls) output = '' buffer_to_string(output, "it 'should pass current expectations' do", indentation_level + 1) # collect all params params_collection = [] mocks_collection = {} method_call_collection = [] return if method_calls.nil? method_calls.each_key do |k| info_blocks_arr = method_calls[k] info_blocks_arr.each do |block| method_call_collection << block params_collection |= block[:params] if !Pretentious::Deconstructor.primitive?(block[:result]) && !block[:result].kind_of?(Exception) params_collection << block[:result] end params_collection << block[:block] unless block[:block].nil? next unless block[:context] block[:context][:calls].each do |mock_block| k = "#{mock_block[:class]}_#{mock_block[:method]}" mocks_collection[k] = [] if mocks_collection[k].nil? mocks_collection[k] << mock_block params_collection << mock_block[:result] end end end if params_collection.size > 0 deps = declare_dependencies(context, params_collection, indentation_level + 2) buffer_inline_to_string(output, deps) if deps != '' end if mocks_collection.keys.size > 0 buffer_to_string(output, generate_rspec_stub(context, mocks_collection, (indentation_level + 2) * @_indentation.length)) end expectations = [] method_calls.each_key do |k| info_blocks_arr = method_calls[k] info_blocks_arr.each do |block| str = '' params_desc_str = if block[:params].size > 0 "when passed #{desc_params(block)}" else '' end buffer_to_string(str, "# #{context_prefix}#{k} #{params_desc_str} should return #{context.value_of(block[:result])}", indentation_level + 2) buffer_inline_to_string(str, generate_expectation(indentation_level, context, fixture, k, block[:params], block[:block], block[:result])) expectations << str unless expectations.include? str end end buffer_inline_to_string(output, expectations.join("\n")) buffer_to_string(output, 'end', indentation_level + 1) output end
get_block_source(context, block)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 58 def get_block_source(context, block) " &#{context.pick_name(block.target_proc.object_id)}" end
pick_matcher(context, result)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 168 def pick_matcher(context, result) if result.is_a? TrueClass 'be true' elsif result.is_a? FalseClass 'be false' elsif result.nil? 'be_nil' elsif result.is_a? Exception 'raise_error' elsif context.map_name result.object_id "eq(#{context.map_name(result.object_id)})" else "eq(#{Pretentious.value_ize(Pretentious::Context.new, result)})" end end
proc_function_generator(block, method)
click to toggle source
# File lib/pretentious/rspec_generator.rb, line 54 def proc_function_generator(block, method) "func_#{method}(#{Pretentious::Deconstructor.block_params_generator(block)})" end