hschne/mr-loga-loga

View on GitHub
spec/mr_loga_loga/context_spec.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

module MrLogaLoga
  RSpec.describe Context do
    let(:formatter) { ->(_severity, _datetime, _progname, message, data) { [message, data].compact.join(',') } }

    let(:logger) { MrLogaLoga::Logger.new($stdout, formatter: formatter) }

    let(:context) { { a: 1 } }

    subject { described_class.new(logger, context) }

    describe '#add' do
      it 'should log context' do
        expect { subject.add(Logger::Severity::DEBUG) }.to output(context.to_s).to_stdout
      end

      it 'should merge context' do
        expect { subject.add(Logger::Severity::DEBUG, b: 2) }.to output({ a: 1, b: 2 }.to_s).to_stdout
      end

      it 'should merge with block message' do
        expected = { a: 1 }
        expect { subject.add(Logger::Severity::DEBUG) { 'message' } }.to output("message,#{expected}").to_stdout
      end
    end

    describe '#debug' do
      it 'should log context' do
        expect { subject.debug }.to output(context.to_s).to_stdout
      end

      it 'should log with block message' do
        expected = { a: 1 }
        expect { subject.debug { 'message' } }.to output("message,#{expected}").to_stdout
      end
    end

    describe '#context' do
      it 'should merge context' do
        expect { subject.context(b: 2).debug }.to output({ a: 1, b: 2 }.to_s).to_stdout
      end

      context 'block' do
        it 'should merge context' do
          expect { subject.context { { b: 2 } }.debug }.to output({ a: 1, b: 2 }.to_s).to_stdout
        end

        it 'should merge with kwargs' do
          expect { subject.context(b: 2) { { c: 3 } }.debug }.to output({ a: 1, b: 2, c: 3 }.to_s).to_stdout
        end

        it 'should overwrite kwargs' do
          expect { subject.context(b: 2) { { b: 3 } }.debug }.to output({ a: 1, b: 3 }.to_s).to_stdout
        end
      end
    end

    describe '#method_missing' do
      it 'should merge context' do
        expect { subject.b(2).debug }.to output({ a: 1, b: 2 }.to_s).to_stdout
      end

      it 'should merge multiple context' do
        expect { subject.b(2).c(3).debug }.to output({ a: 1, b: 2, c: 3 }.to_s).to_stdout
      end

      it 'should merge block' do
        expect { subject.b { 2 }.debug }.to output({ a: 1, b: 2 }.to_s).to_stdout
      end

      it 'should merge block over arg' do
        expect { subject.b(3) { 2 }.debug }.to output({ a: 1, b: 2 }.to_s).to_stdout
      end
    end
  end
end