#!/usr/bin/env ruby # frozen_string_literal: true require 'minitest/autorun' require_relative 'notify_backup' class ByteFormatterTest < Minitest::Test def test_gigabytes assert_equal '4.50 GB', ByteFormatter.format(4_831_838_208) end def test_megabytes assert_equal '823.00 MB', ByteFormatter.format(862_978_048) end def test_kilobytes assert_equal '12.00 KB', ByteFormatter.format(12_288) end def test_bytes_below_one_kb assert_equal '512 B', ByteFormatter.format(512) end def test_nil_returns_nil assert_nil ByteFormatter.format(nil) end def test_string_integer_is_coerced assert_equal '1.00 GB', ByteFormatter.format('1073741824') end end class PayloadBuilderTest < Minitest::Test def base_options { machine: 'desktop', destination: 'synology', status: 'success' } end def test_builds_required_fields payload = PayloadBuilder.new(base_options).build assert_equal 'desktop', payload[:machine] assert_equal 'synology', payload[:destination] assert_equal 'success', payload[:status] assert_match(/\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z\z/, payload[:timestamp]) end def test_formats_bytes_to_human_readable payload = PayloadBuilder.new(base_options.merge(bytes: 1_073_741_824)).build assert_equal '1.00 GB', payload[:bytes_transferred] end def test_omits_nil_optional_fields payload = PayloadBuilder.new(base_options).build refute payload.key?(:bytes_transferred) refute payload.key?(:snapshot_id) refute payload.key?(:log_path) refute payload.key?(:notes) end def test_includes_all_optional_fields_when_present opts = base_options.merge( bytes: 1_048_576, snapshot: 'abc12345', log_path: '/home/jared/.local/log/restic/2026-05-07.log', notes: 'snapshot abc12345 saved' ) payload = PayloadBuilder.new(opts).build assert_equal '1.00 MB', payload[:bytes_transferred] assert_equal 'abc12345', payload[:snapshot_id] assert_equal '/home/jared/.local/log/restic/2026-05-07.log', payload[:log_path] assert_equal 'snapshot abc12345 saved', payload[:notes] end def test_raises_on_invalid_status assert_raises(ArgumentError) { PayloadBuilder.new(base_options.merge(status: 'unknown')).build } end def test_all_valid_statuses_accepted %w[success failure skipped].each do |s| assert PayloadBuilder.new(base_options.merge(status: s)).build end end end