#-- # 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. #++ # Echo logger. # # This logger outputs the raw action text for every action executed. # # Note that this logger does not include execution status information # (i.e. action succeeded, failed or was skipped). # class Bauxite::Loggers::HtmlLogger < Bauxite::Loggers::NullLogger # Constructs a new null logger instance. # def initialize(options) super(options) @data = [] @file = options[:html] || 'test.html' end # Logs the specified string. # # +type+, if specified, should be one of +:error+, +:warning+, # +:info+ (default), +:debug+. # def log(s, type = :info) end # Echoes the raw action text. def log_cmd(action) ret = yield ensure status = case ret; when nil; :error; when false; :skip; else :ok; end test_name = action.ctx.variables['__TEST__'] || 'Main' test = @data.find { |t| t[:name] == test_name } unless test test = { :name => test_name, :actions => [] } @data << test end capture = action.ctx.variables['__CAPTURE__'] if capture == @last_capture capture = nil else @last_capture = capture end test[:actions] << { :cmd => action.cmd, :args => action.args(true), :action => action, :status => status, :capture => capture } ret end # Completes the log execution. # def finalize(ctx) output = ctx.variables['__OUTPUT__'] || '' html = " " 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, "
#{action[:status].upcase}
") 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 = @file file = File.join(output, file) if output != '' File.open(file, 'w') { |f| f.write html } end private def _d(depth, s) "\n"+depth.times.inject('') { |s,i| s + "\t" } + s end def _img(output, path) path = path[output.size+1..-1] unless output == '' "" end end