diff --git a/lib/twiglet/logger.rb b/lib/twiglet/logger.rb index b9e4f5b..abcfd15 100644 --- a/lib/twiglet/logger.rb +++ b/lib/twiglet/logger.rb @@ -81,6 +81,13 @@ def with(default_properties) ) end + def validation_schema(validation_schema) + self.class.new( + @service_name, + **@args.merge(validation_schema: validation_schema) + ) + end + def context_provider(&blk) new_context_providers = Array(@args[:context_providers]) new_context_providers << blk diff --git a/lib/twiglet/version.rb b/lib/twiglet/version.rb index c93d801..b761c18 100644 --- a/lib/twiglet/version.rb +++ b/lib/twiglet/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Twiglet - VERSION = '3.12.0' + VERSION = '3.13.0' end diff --git a/test/logger_test.rb b/test/logger_test.rb index 3283ce5..649e496 100644 --- a/test/logger_test.rb +++ b/test/logger_test.rb @@ -681,11 +681,71 @@ end end + describe '#validation_schema' do + it 'allows for reconfiguring the validation_schema on new logger instances' do + validation_schema = <<-JSON + { + "type": "object", + "required": ["pet"], + "properties": { + "pet": { + "type": "object", + "required": ["name", "best_boy_or_girl?"], + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "best_boy_or_girl?": { + "type": "boolean" + } + } + } + } + } + JSON + + logger = Twiglet::Logger.new( + 'petshop', + now: @now, + output: @buffer + ) + + message = { message: 'hi' } + + pet_message = { + pet: { name: 'Davis', best_boy_or_girl?: true, species: 'dog' } + } + + logger.info(message) + log = read_json(@buffer) + assert_equal 'hi', log[:message] + + error = assert_raises JSON::Schema::ValidationError do + logger.info(pet_message) + end + assert_equal "The property '#/' did not contain a required property of 'message'", error.message + + logger = logger.validation_schema(validation_schema) + + error = assert_raises JSON::Schema::ValidationError do + logger.info(message) + end + assert_equal "The property '#/' did not contain a required property of 'pet'", error.message + + logger.info(pet_message) + log = read_json(@buffer) + assert_equal 'Davis', log[:pet][:name] + end + end + private def read_json(buffer) buffer.rewind - JSON.parse(buffer.read, symbolize_names: true) + string = buffer.read + buffer.rewind + JSON.parse(string, symbolize_names: true) end end # rubocop:enable Metrics/BlockLength