#-- # Copyright (c) 2014 Patricio Zavolinsky # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #++ require 'base64' # Html logger. # # This logger creates an HTML report of the test execution, linking to the # captures taken, if any. # # Html logger options include: # [html] Name of the outpus HTML report file. If not present, defaults # to "test.html". # [html_package] If set, embed captures into the HTML report file # using the data URI scheme (base64 encoded). The # captures embedded into the report are deleted from # the filesystem. # class Bauxite::Loggers::HtmlLogger < Bauxite::Loggers::ReportLogger # Constructs a new null logger instance. # def initialize(options) super(options) @file = options[:html] || 'test.html' @imgs = [] end # Completes the log execution. # def finalize(ctx) output = ctx.variables['__OUTPUT__'] || '' html = " " html << _d(2, "
Created using bauxite on #{Time.new}
") if ctx.tests.any? html << _d(2, "

Test Summary

") html << _d(2, "") html << _d(3, "") ctx.tests.each_with_index do |t,idx| error = t[:error] error = error ? error.message : '' html << _d(3, "") html << _d(4, "") html << _d(3, "") end html << _d(2, "
NameTimeStatusError
#{t[:name]}#{t[:time].round(2)}#{t[:status]}#{error}
") end html << _d(2, "

Test Details

") @data.each do |test| name = test[:name] status = test[:actions].find { |a| a[:status] == :error } ? :error : :ok html << _d(2, "") html << _d(2, "
#{name}
#{status.upcase}
") html << _d(2, "
") test[:actions].each_with_index do |action,idx| html << _d(3, "
") html << _d(4, "
#{action[:cmd]}
") html << _d(4, "
#{action[:args].join(' ')}
") html << _d(4, "
") html << _d(5, "
(#{action[:time].round(2).to_s}s)
") html << _d(5, "
#{action[:status].upcase}
") html << _d(4, "
") html << _d(3, "
") capture = action[:capture] if capture html << _d(3, "
#{_img(output, capture)}
") end end item = ctx.tests.find { |t| t[:name] == name } if item and item[:error] capture = item[:error].variables['__CAPTURE__'] if capture html << _d(3, "
#{_img(output, capture)}
") end end html << _d(2, "
") end html << " " file = ctx.output_path(@file) File.open(file, 'w') { |f| f.write html } File.delete(*@imgs) if @imgs.size > 0 end private def _d(depth, s) "\n"+depth.times.inject('') { |s,i| s + "\t" } + s end def _img(output, path) if @options[:html_package] content = Base64.encode64(File.open(path, 'rb') { |f| f.read }) @imgs << path unless @imgs.include? path "" else path = path[output.size+1..-1] unless output == '' "" end end end