dawarich/spec/lib/json_stream_handler_spec.rb

58 lines
2.3 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
require 'oj'
RSpec.describe JsonStreamHandler do
let(:processor) { double('StreamProcessor') }
let(:handler) { described_class.new(processor) }
let(:payload) do
{
'counts' => { 'places' => 2, 'visits' => 1, 'points' => 1 },
'settings' => { 'theme' => 'dark' },
'areas' => [{ 'name' => 'Home' }],
'places' => [
{ 'name' => 'Cafe', 'latitude' => 1.0, 'longitude' => 2.0 },
{ 'name' => 'Library', 'latitude' => 3.0, 'longitude' => 4.0 }
],
'visits' => [
{
'name' => 'Morning Coffee',
'started_at' => '2025-01-01T09:00:00Z',
'ended_at' => '2025-01-01T10:00:00Z'
}
],
'points' => [
{ 'timestamp' => 1, 'lonlat' => 'POINT(2 1)' }
]
}
end
before do
allow(processor).to receive(:handle_section)
allow(processor).to receive(:handle_stream_value)
allow(processor).to receive(:finish_stream)
end
it 'streams configured sections and delegates other values immediately' do
Oj.saj_parse(handler, Oj.dump(payload, mode: :compat))
expect(processor).to have_received(:handle_section).with('counts', hash_including('places' => 2))
expect(processor).to have_received(:handle_section).with('settings', hash_including('theme' => 'dark'))
expect(processor).to have_received(:handle_section).with('areas', [hash_including('name' => 'Home')])
expect(processor).to have_received(:handle_stream_value).with('places', hash_including('name' => 'Cafe'))
expect(processor).to have_received(:handle_stream_value).with('places', hash_including('name' => 'Library'))
expect(processor).to have_received(:handle_stream_value).with('visits', hash_including('name' => 'Morning Coffee'))
expect(processor).to have_received(:handle_stream_value).with('points', hash_including('timestamp' => 1))
expect(processor).to have_received(:finish_stream).with('places')
expect(processor).to have_received(:finish_stream).with('visits')
expect(processor).to have_received(:finish_stream).with('points')
expect(processor).not_to have_received(:handle_section).with('places', anything)
expect(processor).not_to have_received(:handle_section).with('visits', anything)
expect(processor).not_to have_received(:handle_section).with('points', anything)
end
end