1+ RSpec . describe Unleash ::StreamingEventProcessor do
2+ let ( :engine ) { YggdrasilEngine . new }
3+ let ( :processor ) { Unleash ::StreamingEventProcessor . new ( engine ) }
4+
5+ before do
6+ Unleash . configure do |config |
7+ config . url = 'http://streaming-test-url/'
8+ config . app_name = 'streaming-my-test-app'
9+ end
10+
11+ Unleash . logger = Unleash . configuration . logger
12+ end
13+
14+ after do
15+ WebMock . reset!
16+ File . delete ( Unleash . configuration . backup_file ) if File . exist? ( Unleash . configuration . backup_file )
17+ end
18+
19+ describe '#process_event' do
20+ let ( :updated_event_data ) do
21+ {
22+ "events" : [
23+ {
24+ "type" : "feature-updated" ,
25+ "eventId" : 2 ,
26+ "feature" : {
27+ "name" : "test-feature" ,
28+ "enabled" : true ,
29+ "strategies" : [ { "name" : "default" } ]
30+ }
31+ }
32+ ]
33+ } . to_json
34+ end
35+
36+ let ( :connected_event_data ) do
37+ {
38+ "events" : [
39+ {
40+ "type" : "hydration" ,
41+ "eventId" : 1 ,
42+ "features" : [
43+ {
44+ "name" : "test-feature" ,
45+ "enabled" : true ,
46+ "strategies" : [ { "name" : "default" } ]
47+ }
48+ ] ,
49+ "segments" : [ ]
50+ }
51+ ]
52+ } . to_json
53+ end
54+
55+ class TestEvent
56+ attr_reader :type , :data
57+
58+ def initialize ( type , data )
59+ @type = type
60+ @data = data
61+ end
62+ end
63+
64+ context 'when processing unleash-updated event' do
65+ let ( :event ) { TestEvent . new ( 'unleash-updated' , updated_event_data ) }
66+
67+ it 'creates a backup file with toggle data' do
68+ processor . process_event ( event )
69+
70+ backup_file = Unleash . configuration . backup_file
71+ expect ( File . exist? ( backup_file ) ) . to eq ( true )
72+
73+ content = File . read ( backup_file )
74+ expect ( content ) . to eq ( updated_event_data )
75+
76+ parsed = JSON . parse ( content )
77+ expect ( parsed ) . to include ( 'events' )
78+ expect ( parsed [ 'events' ] . first ) . to include ( 'feature' )
79+ expect ( parsed [ 'events' ] . first [ 'feature' ] [ 'name' ] ) . to eq ( 'test-feature' )
80+ end
81+
82+ it 'updates the engine state' do
83+ processor . process_event ( event )
84+
85+ expect ( engine . enabled? ( 'test-feature' , { } ) ) . to eq ( true )
86+ end
87+ end
88+
89+ context 'when processing unleash-connected event' do
90+ let ( :event ) { TestEvent . new ( 'unleash-connected' , connected_event_data ) }
91+
92+ it 'creates a backup file with toggle data' do
93+ processor . process_event ( event )
94+
95+ backup_file = Unleash . configuration . backup_file
96+ expect ( File . exist? ( backup_file ) ) . to eq ( true )
97+
98+ content = File . read ( backup_file )
99+ expect ( content ) . to eq ( connected_event_data )
100+
101+ parsed = JSON . parse ( content )
102+ expect ( parsed ) . to include ( 'events' )
103+ expect ( parsed [ 'events' ] . first ) . to include ( 'features' )
104+ expect ( parsed [ 'events' ] . first [ 'features' ] . first [ 'name' ] ) . to eq ( 'test-feature' )
105+ end
106+
107+ it 'updates the engine state' do
108+ processor . process_event ( event )
109+
110+ expect ( engine . enabled? ( 'test-feature' , { } ) ) . to eq ( true )
111+ end
112+ end
113+
114+ context 'when processing unknown event type' do
115+ let ( :event ) { TestEvent . new ( 'unknown-event' , updated_event_data ) }
116+
117+ it 'does not create a backup file' do
118+ processor . process_event ( event )
119+
120+ backup_file = Unleash . configuration . backup_file
121+ expect ( File . exist? ( backup_file ) ) . to eq ( false )
122+ end
123+
124+ it 'does not update the engine state' do
125+ initial_enabled = engine . enabled? ( 'test-feature' , { } )
126+
127+ processor . process_event ( event )
128+
129+ expect ( engine . enabled? ( 'test-feature' , { } ) ) . to eq ( initial_enabled )
130+ end
131+ end
132+
133+ context 'when processing event with invalid JSON' do
134+ let ( :invalid_data ) { 'invalid json data that looks like real streaming data but is malformed' }
135+ let ( :event ) { TestEvent . new ( 'unleash-updated' , invalid_data ) }
136+
137+ it 'handles JSON parse errors gracefully' do
138+ expect { processor . process_event ( event ) } . not_to raise_error
139+ end
140+
141+ it 'still creates a backup file with the raw data' do
142+ processor . process_event ( event )
143+
144+ backup_file = Unleash . configuration . backup_file
145+ expect ( File . exist? ( backup_file ) ) . to eq ( true )
146+
147+ content = File . read ( backup_file )
148+ expect ( content ) . to eq ( invalid_data )
149+ end
150+ end
151+ end
152+ end
0 commit comments