18F/e-QIP-prototype

View on GitHub
api/mock/log_recorder.go

Summary

Maintainability
A
0 mins
Test Coverage
package mock

import (
    "fmt"

    "github.com/18F/e-QIP-prototype/api"
)

// Log Recorder

// LogLine is a mock log line
type LogLine struct {
    Level   string
    Message string
    Fields  api.LogFields
}

// LogRecorder is a mock log recorder
type LogRecorder struct {
    LogService
    lines   []LogLine
    globals api.LogFields
}

// RecordLine records and returns a new LogLine with its level, message, and fields.
func (r *LogRecorder) RecordLine(level string, message string, fields api.LogFields) LogLine {
    newLine := LogLine{
        Level:   level,
        Message: message,
        Fields:  api.LogFields{},
    }

    for k, v := range r.globals {
        newLine.Fields[k] = v
    }

    for k, v := range fields {
        newLine.Fields[k] = v
    }

    r.lines = append(r.lines, newLine)

    return newLine
}

// Info records new LogLine as INFO level
func (r *LogRecorder) Info(message string, fields api.LogFields) {
    line := r.RecordLine("INFO", message, fields)
    r.LogService.Info(line.Message, line.Fields)
}

// AddField adds new fields to LogRecorder's globals field
func (r *LogRecorder) AddField(name string, value interface{}) {
    if r.globals == nil {
        r.globals = api.LogFields{}
    }
    r.globals[name] = value
}

// GetOnlyMatchingMessage returns singular LogLine that matches message or errors
func (r *LogRecorder) GetOnlyMatchingMessage(message string) (LogLine, error) {
    messages := r.MatchingMessages(message)
    if len(messages) != 1 {
        return LogLine{}, fmt.Errorf("Didn't find only one line for message: %s (%s) ", message, messages)
    }
    return messages[0], nil
}

// MatchingMessages compares message to LogLines to seek those LogLines that match on LogRecorder
func (r *LogRecorder) MatchingMessages(message string) []LogLine {
    matches := []LogLine{}
    for _, line := range r.lines {
        if line.Message == message {
            matches = append(matches, line)
        }
    }
    return matches
}