class Bauxite::Loggers::HtmlLogger

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).

Public Class Methods

new(options) click to toggle source

Constructs a new null logger instance.

Calls superclass method Bauxite::Loggers::NullLogger.new
# File lib/bauxite/loggers/html.rb, line 34
def initialize(options)
        super(options)
        @data = []
        @file = options[:html] || 'test.html'
end

Public Instance Methods

finalize(ctx) click to toggle source

Completes the log execution.

# File lib/bauxite/loggers/html.rb, line 81
        def finalize(ctx)
                output = ctx.variables['__OUTPUT__'] || ''
                
                html = "<!DOCTYPE html>
<html>
        <head>
                <style type='text/css'>
                        body { font: 10pt sans-serif; }
                        .action div { display: inline-block; }
                        .cmd { width: 100px }
                        .status { width: 100px; float: right; text-align: center; font-weight: bold }
                        .test { background-color: #DFDFFF; margin-top: 20px }
                        .ok    .status { background-color: #DFFFDF }
                        .error .status { background-color: #FFDFDF }
                        .skip  .status { background-color: #FFDFFF }
                        .capture { border: 1px solid black }
                        .capture img { max-width: 100% }
                        .odd { background-color: #EEEEEE }
                        .summary th { background-color: #DFDFFF; text-align: left }
                        .summary td { cursor: pointer; }
                        
                </style>
                <script type='text/javascript'>
                        function show(target) {
                                var e = document.getElementById(target+'_content');
                                window.location.href = '#'+target;
                        }
                </script>
        </head>
        <body>"
        
                if ctx.tests.any?
                        html << _d(2, "<h1>Test Summary</h1>")
                        html << _d(2, "<table class='summary'>")
                        html << _d(3, "<tr><th>Name</th><th>Time</th><th>Status</th><th>Error</th></tr>")
                
                        ctx.tests.each_with_index do |t,idx|
                                error = t[:error]
                                error = error ? error.message : ''
                                html << _d(3, "<tr class='#{t[:status].downcase} #{(idx % 2) == 1 ? 'odd' : 'even'}' onclick='show(\"#{t[:name]}\")'>")
                                html << _d(4, "<td>#{t[:name]}</td><td>#{t[:time].round(2)}</td><td class='status'>#{t[:status]}</td><td>#{error}</td>")
                                html << _d(3, "</tr>")
                        end
                        
                        html << _d(2, "</table>")
                end
                
                html << _d(2, "<h1>Test Details</h1>")
                @data.each do |test|
                        name = test[:name]
                        status = test[:actions].find { |a| a[:status] == :error } ? :error : :ok
                        html << _d(2, "<a name='#{name}'></a>")
                        html << _d(2, "<div class='test #{status}'>#{name}<div class='status'>#{status.upcase}</div></div>")
                        html << _d(2, "<div id='#{name}_content' class='test-content'>")
                                
                        test[:actions].each_with_index do |action,idx|
                                html << _d(3, "<div class='action #{action[:status]} #{(idx % 2) == 1 ? 'odd' : 'even'}'>")
                                html << _d(4,       "<div class='cmd'>#{action[:cmd]}</div>")
                                html << _d(4,       "<div class='args'>#{action[:args].join(' ')}</div>")
                                html << _d(4,       "<div class='status'>#{action[:status].upcase}</div>")
                                html << _d(3, "</div>")
                                capture = action[:capture]
                                if capture
                                        html << _d(3, "<div class='capture'>#{_img(output, capture)}</div>")
                                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, "<div class='capture'>#{_img(output, capture)}</div>")
                                end
                        end
                        
                        html << _d(2, "</div>")
                end
                html << "
        </body>
</html>"
                file = @file
                file = File.join(output, file) if output != ''
                File.open(file, 'w') { |f| f.write html }
        end
log(s, type = :info) click to toggle source

Logs the specified string.

type, if specified, should be one of :error, :warning, :info (default), :debug.

# File lib/bauxite/loggers/html.rb, line 45
def log(s, type = :info)
end
log_cmd(action) { || ... } click to toggle source

Echoes the raw action text.

# File lib/bauxite/loggers/html.rb, line 49
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