lib/reportir.rb in reportir-0.2.1 vs lib/reportir.rb in reportir-0.3.0

- old
+ new

@@ -1,109 +1,131 @@ require "reportir/version" require 's3_uploader' require 'aws-sdk' module Reportir - @@static_site_template_path = Gem.find_files('reportir')[1] +'/static_site_template' - @@template_subdirectory_for_test_artifacts = 'test_run' @@step = 0 + @@tests = [] # has to be array for front-end def upload_result_to_s3_as_static_site check_for_env_vars - clone_template - reset_orig_template # TODO: clone before screenshots are possible - save_final_markup_in_clone - write_ractive_models_in_clone(screenshots: screenshot_paths, nav: nav_links) - upload_clone_to_s3 - delete_local_clone + clear_previous_results_from_s3 + save_final_markup + write_javascript_models + upload_to_s3 + delete_tmp_files_for_this_test end + + def s3_screenshot(method) + create_current_test #TODO: before-filter?? + @@step = @@step+=1 + image_name = "#{@@step}-#{method}" + local_path = "#{local_test_root}/#{image_name}.png" + FileUtils.mkdir_p(local_test_root) unless Dir.exists?(local_test_root) + @browser.screenshot.save(local_path) + current_test[:screenshots] << { name: image_name, src: "#{public_path_for_this_test}/#{image_name}.png" } + end private def check_for_env_vars raise Reportir::Error.new 'Missing ENV AWS_DEFAULT_BUCKET' unless ENV['AWS_DEFAULT_BUCKET'] raise Reportir::Error.new 'Missing ENV AWS_SECRET_ACCESS_KEY' unless ENV['AWS_SECRET_ACCESS_KEY'] raise Reportir::Error.new 'Missing ENV AWS_ACCESS_KEY_ID' unless ENV['AWS_ACCESS_KEY_ID'] raise Reportir::Error.new 'Missing ENV AWS_DEFAULT_REGION' unless ENV['AWS_DEFAULT_REGION'] end - def clone_template - FileUtils.cp_r "#{@@static_site_template_path}/.", clone_dir_path + def delete_tmp_files_for_this_test + FileUtils.rm_rf local_test_root end - def reset_orig_template - FileUtils.rm_rf "#{@@static_site_template_path}/#{@@template_subdirectory_for_test_artifacts}" + def save_final_markup + s3_screenshot('final') + path = "#{local_test_root}/final.html" + File.open(path, 'w') { |f| f.write @browser.html } + current_test[:add_links] << { name: 'Markup from Last Page', path: "#{public_path_for_this_test}/final.html" } end - def save_final_markup_in_clone - s3_screenshot('final') - File.open("#{deletable_data_path}/final.html", 'w') {|f| f.write @browser.html } + def write_javascript_models + string = %{ + var navigation = #{array_of_test_names.to_json};\n + var tests = #{@@tests.to_json};\n + } + File.open(local_model_file_path, "w") { |f| f.write(string) } end - def write_ractive_models_in_clone(data) - data.each do |k,v| - model = {el: "##{k}_container", template: "##{k}_template", data: {k => v}} - File.open("#{clone_dir_path}/js/main.js", "a") { |f| f.write("var #{k} = new Ractive(#{model.to_json});\n") } - end + def clear_previous_results_from_s3 + puts "deleting all previous test data from s3" + ::Aws::S3::Bucket.new(ENV['AWS_DEFAULT_BUCKET']).delete_objects({ + delete: { + objects: [{ key: "#{public_path_for_this_test}" }], + quiet: true + } + }) end - def upload_clone_to_s3 - puts '====== STARTING S3 UPLOAD =========' + def upload_to_s3 puts '' - ::Aws::S3::Bucket.new(ENV['AWS_DEFAULT_BUCKET']).clear! - ::S3Uploader.upload_directory(clone_dir_path, ENV['AWS_DEFAULT_BUCKET'], { - :destination_dir => test_name, + puts '' + puts '====== STARTING S3 UPLOAD =========' + ::Aws::S3::Resource.new.bucket(ENV['AWS_DEFAULT_BUCKET']).object('js/models.js').upload_file(local_model_file_path) + puts "Uploading #{local_model_file_path} to /js/models.js" + ::S3Uploader.upload_directory(local_test_root, ENV['AWS_DEFAULT_BUCKET'], { + :destination_dir => public_path_for_this_test, :threads => 5, s3_key: ENV['AWS_ACCESS_KEY_ID'], s3_secret: ENV['AWS_SECRET_ACCESS_KEY'], region: ENV['AWS_DEFAULT_REGION'] }) puts '' + puts '' puts '====== S3 UPLOAD COMPLETE =========' puts 'URL: ' + static_site_url puts '===================================' + puts '' + puts '' end - def delete_local_clone - FileUtils.rm_rf clone_dir_path + def current_test + @@tests.select{ |test| test[:name] == test_name }.first end - def test_name - RSpec.current_example.metadata[:full_description].gsub(/[^\w\s]/,'').gsub(/\s/,'_') + def create_current_test + if !current_test || current_test.empty? + @@tests << { name: test_name, screenshots: [], add_links: [] } + end end - def clone_dir_path - "./tmp/#{test_name}" + def array_of_test_names + @@tests.map{|t| t[:name] } end - def static_site_url - "http://#{ENV['AWS_DEFAULT_BUCKET']}.s3-website-#{ENV['AWS_DEFAULT_REGION']}.amazonaws.com/#{test_name}" + def local_model_file_path + "#{local_root}/models.js" end - def s3_screenshot(method) - @@step = @@step+=1 - image_name = "#{@@step}-#{method}" - FileUtils.mkdir_p(deletable_data_path) unless Dir.exists?(deletable_data_path) - @browser.screenshot.save("#{deletable_data_path}/#{image_name}.png") + def local_test_root + "#{local_root}/#{public_path_for_this_test}" end - def deletable_data_path - "#{clone_dir_path}/#{@@template_subdirectory_for_test_artifacts}" + def local_root + "./tmp/reportir" end - def nav_links - {'Last Page as Markup' => "#{@@template_subdirectory_for_test_artifacts}/final.html"} + def public_path_for_this_test + "#{public_artifact_root}/#{test_name}" end - def screenshot_paths - images = [] - Dir["#{deletable_data_path}/**/*.png"].sort_by { |x| x[/\d+/].to_i }.each do |src| - images << "#{@@template_subdirectory_for_test_artifacts}/#{Pathname.new(src).basename}" - end - images + def public_artifact_root + "test_artifacts" end - def clear_out_any_old_results - puts "> Cleaning out old #{deletable_data_path} directory" - FileUtils.rm_rf "#{deletable_data_path}/*" + def test_name + ::RSpec.current_example.metadata[:test_name] || ::RSpec.current_example.metadata[:full_description].gsub(/[^\w\s]/,'').gsub(/\s/,'_') end + + def static_site_url + # TODO: use aws-sdk for this. + "http://#{ENV['AWS_DEFAULT_BUCKET']}.s3-website-#{ENV['AWS_DEFAULT_REGION']}.amazonaws.com" + end + class Error < ::StandardError; end end