Skip to content

Commit 1de0a98

Browse files
committed
CLI tests and fixes
1 parent 2a30443 commit 1de0a98

2 files changed

Lines changed: 325 additions & 3 deletions

File tree

lib/rage/cli.rb

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,18 +307,32 @@ def self.await(fibers)
307307
def print_event_subscribers_tree(event_class)
308308
subscribers = Rage::Events.__get_subscribers(event_class)
309309

310-
tree = event_class.ancestors.each_with_object({}) do |ancestor, memo|
310+
event_ancestors = event_class.ancestors.take_while { |klass| klass != Struct && klass != Data && klass != Object }
311+
312+
# build a tree of all events and their subscribers
313+
tree = event_ancestors.each_with_object({}) do |ancestor, memo|
311314
level = event_class.ancestors.count { |klass| klass.ancestors.include?(ancestor) } - 1
312315
filtered_subscribers = subscribers.select { |subscriber| subscriber.__event_classes.include?(ancestor) }
313316

314-
memo[ancestor] = { level:, subscribers: filtered_subscribers } if filtered_subscribers.any?
317+
memo[ancestor] = { level:, subscribers: filtered_subscribers }
318+
end
319+
320+
# reject events without subscribers located on the last levels
321+
i = 0
322+
tree = tree.reject do |_, node|
323+
level, subscribers = node[:level], node[:subscribers]
324+
next_level = tree.values.dig(i + 1, :level)
325+
i += 1
326+
327+
(next_level.nil? || next_level < level) && subscribers.empty?
315328
end
316329

330+
# indentation for each level
317331
padding = " " * 3
318332

333+
# print the tree
319334
tree.each_with_index do |(event_ancestor, node), i|
320335
level, subscribers = node[:level], node[:subscribers]
321-
break if event_ancestor == Data || event_ancestor == Object
322336
next_level = tree.values.dig(i + 1, :level)
323337

324338
prefix = if i > 0 && next_level != level

spec/rage/cli_spec.rb

Lines changed: 308 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,312 @@
293293
end
294294
end
295295
end
296+
297+
describe "#events" do
298+
subject { rage_cli.events }
299+
300+
before do
301+
allow(rage_cli).to receive(:environment)
302+
Rage::Events.__reset_subscribers
303+
end
304+
305+
after do
306+
Rage::Events.__reset_subscribers
307+
end
308+
309+
def cli_event(str) = "\e[90m#{str}\e[0m"
310+
def cli_subscriber(str) = "\e[1m#{str}\e[0m"
311+
312+
def def_event(name, parent: Object, &block)
313+
event = Class.new(parent)
314+
event.class_eval(&block) if block
315+
stub_const(name, event)
316+
317+
event
318+
end
319+
320+
def def_subscriber(name, subscribe_to:)
321+
subscriber = Class.new do
322+
include Rage::Events::Subscriber
323+
end
324+
325+
subscriber.subscribe_to(subscribe_to)
326+
stub_const(name, subscriber)
327+
328+
subscriber
329+
end
330+
331+
context "with no subscribers" do
332+
it "doesn't error out" do
333+
expect { subject }.to output("").to_stdout
334+
end
335+
end
336+
337+
context "with one subscriber" do
338+
before do
339+
user_created = def_event("UserCreated")
340+
def_subscriber("SendWelcomeEmail", subscribe_to: user_created)
341+
end
342+
343+
let(:expected) do
344+
<<~CLI
345+
├─ #{cli_event("UserCreated")}
346+
│ └─ #{cli_subscriber("SendWelcomeEmail")}
347+
CLI
348+
end
349+
350+
it "correctly outputs subscribers tree" do
351+
expect { subject }.to output(expected).to_stdout
352+
end
353+
end
354+
355+
context "with multiple subscribers" do
356+
before do
357+
user_created = def_event("UserCreated")
358+
359+
def_subscriber("SendWelcomeEmail", subscribe_to: user_created)
360+
def_subscriber("GenerateAvatar", subscribe_to: user_created)
361+
end
362+
363+
let(:expected) do
364+
<<~CLI
365+
├─ #{cli_event("UserCreated")}
366+
│ ├─ #{cli_subscriber("SendWelcomeEmail")}
367+
│ └─ #{cli_subscriber("GenerateAvatar")}
368+
CLI
369+
end
370+
371+
it "correctly outputs subscribers tree" do
372+
expect { subject }.to output(expected).to_stdout
373+
end
374+
end
375+
376+
context "with multiple events" do
377+
before do
378+
user_created = def_event("UserCreated")
379+
def_subscriber("SendWelcomeEmail", subscribe_to: user_created)
380+
def_subscriber("GenerateAvatar", subscribe_to: user_created)
381+
382+
order_created = def_event("OrderCreated")
383+
def_subscriber("ScheduleDelivery", subscribe_to: order_created)
384+
end
385+
386+
let(:expected) do
387+
<<~CLI
388+
├─ #{cli_event("UserCreated")}
389+
│ ├─ #{cli_subscriber("SendWelcomeEmail")}
390+
│ └─ #{cli_subscriber("GenerateAvatar")}
391+
├─ #{cli_event("OrderCreated")}
392+
│ └─ #{cli_subscriber("ScheduleDelivery")}
393+
CLI
394+
end
395+
396+
it "correctly outputs subscribers tree" do
397+
expect { subject }.to output(expected).to_stdout
398+
end
399+
400+
context "with filtered events" do
401+
subject { rage_cli.events("OrderCreated") }
402+
403+
let(:expected) do
404+
<<~CLI
405+
├─ #{cli_event("OrderCreated")}
406+
│ └─ #{cli_subscriber("ScheduleDelivery")}
407+
CLI
408+
end
409+
410+
it "correctly outputs subscribers tree" do
411+
expect { subject }.to output(expected).to_stdout
412+
end
413+
end
414+
end
415+
416+
context "with two levels" do
417+
before do
418+
event = def_event("Event")
419+
def_subscriber("LogEvent", subscribe_to: event)
420+
421+
user_event = def_event("UserEvent", parent: event)
422+
user_created = def_event("UserCreated", parent: user_event)
423+
424+
def_subscriber("SendWelcomeEmail", subscribe_to: user_created)
425+
def_subscriber("GenerateAvatar", subscribe_to: user_created)
426+
def_subscriber("UpdateUsersCache", subscribe_to: user_event)
427+
end
428+
429+
let(:expected) do
430+
<<~CLI
431+
├─ #{cli_event("UserCreated")}
432+
│ ├─ #{cli_subscriber("SendWelcomeEmail")}
433+
│ ├─ #{cli_subscriber("GenerateAvatar")}
434+
| └─ #{cli_event("UserEvent")}
435+
│ ├─ #{cli_subscriber("UpdateUsersCache")}
436+
| └─ #{cli_event("Event")}
437+
│ └─ #{cli_subscriber("LogEvent")}
438+
CLI
439+
end
440+
441+
it "correctly outputs subscribers tree" do
442+
expect { subject }.to output(expected).to_stdout
443+
end
444+
end
445+
446+
context "with three levels" do
447+
before do
448+
trackable_event = Module.new
449+
stub_const("TrackableEvent", trackable_event)
450+
451+
instrumented_event = Module.new do
452+
include TrackableEvent
453+
end
454+
stub_const("InstrumentedEvent", instrumented_event)
455+
456+
event = def_event("Event")
457+
458+
user_event = def_event("UserEvent", parent: event) do
459+
include InstrumentedEvent
460+
end
461+
user_created = def_event("UserCreated", parent: user_event)
462+
463+
def_subscriber("SendWelcomeEmail", subscribe_to: user_created)
464+
def_subscriber("GenerateAvatar", subscribe_to: user_created)
465+
def_subscriber("UpdateUsersCache", subscribe_to: user_event)
466+
467+
def_subscriber("LogEvent", subscribe_to: event)
468+
def_subscriber("TrackPublishedAt", subscribe_to: trackable_event)
469+
def_subscriber("ReportMetrics", subscribe_to: instrumented_event)
470+
end
471+
472+
let(:expected) do
473+
<<~CLI
474+
├─ #{cli_event("UserCreated")}
475+
│ ├─ #{cli_subscriber("SendWelcomeEmail")}
476+
│ ├─ #{cli_subscriber("GenerateAvatar")}
477+
| └─ #{cli_event("UserEvent")}
478+
│ ├─ #{cli_subscriber("UpdateUsersCache")}
479+
| └─ #{cli_event("InstrumentedEvent")}
480+
│ ├─ #{cli_subscriber("ReportMetrics")}
481+
| └─ #{cli_event("TrackableEvent")}
482+
│ └─ #{cli_subscriber("TrackPublishedAt")}
483+
| └─ #{cli_event("Event")}
484+
│ └─ #{cli_subscriber("LogEvent")}
485+
CLI
486+
end
487+
488+
it "correctly outputs subscribers tree" do
489+
expect { subject }.to output(expected).to_stdout
490+
end
491+
end
492+
493+
context "with one empty level" do
494+
before do
495+
event = def_event("Event")
496+
def_subscriber("LogEvent", subscribe_to: event)
497+
498+
user_event = def_event("UserEvent", parent: event)
499+
user_created = def_event("UserCreated", parent: user_event)
500+
501+
def_subscriber("SendWelcomeEmail", subscribe_to: user_created)
502+
def_subscriber("GenerateAvatar", subscribe_to: user_created)
503+
end
504+
505+
let(:expected) do
506+
<<~CLI
507+
├─ #{cli_event("UserCreated")}
508+
│ ├─ #{cli_subscriber("SendWelcomeEmail")}
509+
│ ├─ #{cli_subscriber("GenerateAvatar")}
510+
| └─ #{cli_event("UserEvent")}
511+
| └─ #{cli_event("Event")}
512+
│ └─ #{cli_subscriber("LogEvent")}
513+
CLI
514+
end
515+
516+
it "correctly outputs subscribers tree" do
517+
expect { subject }.to output(expected).to_stdout
518+
end
519+
end
520+
521+
context "with two empty levels" do
522+
before do
523+
trackable_event = Module.new do
524+
include Module.new
525+
end
526+
stub_const("TrackableEvent", trackable_event)
527+
528+
instrumented_event = Module.new do
529+
include TrackableEvent
530+
end
531+
stub_const("InstrumentedEvent", instrumented_event)
532+
533+
event = def_event("Event")
534+
user_event = def_event("UserEvent", parent: event) do
535+
include InstrumentedEvent
536+
end
537+
user_created = def_event("UserCreated", parent: user_event)
538+
539+
def_subscriber("SendWelcomeEmail", subscribe_to: user_created)
540+
def_subscriber("TrackPublishedAt", subscribe_to: trackable_event)
541+
end
542+
543+
let(:expected) do
544+
<<~CLI
545+
├─ #{cli_event("UserCreated")}
546+
│ ├─ #{cli_subscriber("SendWelcomeEmail")}
547+
| └─ #{cli_event("UserEvent")}
548+
| └─ #{cli_event("InstrumentedEvent")}
549+
| └─ #{cli_event("TrackableEvent")}
550+
│ └─ #{cli_subscriber("TrackPublishedAt")}
551+
CLI
552+
end
553+
554+
it "correctly outputs subscribers tree" do
555+
expect { subject }.to output(expected).to_stdout
556+
end
557+
end
558+
559+
context "with three levels and one empty level" do
560+
before do
561+
trackable_event = Module.new
562+
stub_const("TrackableEvent", trackable_event)
563+
564+
instrumented_event = Module.new do
565+
include TrackableEvent
566+
end
567+
stub_const("InstrumentedEvent", instrumented_event)
568+
569+
event = def_event("Event")
570+
571+
user_event = def_event("UserEvent", parent: event) do
572+
include InstrumentedEvent
573+
end
574+
user_created = def_event("UserCreated", parent: user_event)
575+
576+
def_subscriber("SendWelcomeEmail", subscribe_to: user_created)
577+
def_subscriber("GenerateAvatar", subscribe_to: user_created)
578+
def_subscriber("UpdateUsersCache", subscribe_to: user_event)
579+
580+
def_subscriber("LogEvent", subscribe_to: event)
581+
def_subscriber("TrackPublishedAt", subscribe_to: trackable_event)
582+
end
583+
584+
let(:expected) do
585+
<<~CLI
586+
├─ #{cli_event("UserCreated")}
587+
│ ├─ #{cli_subscriber("SendWelcomeEmail")}
588+
│ ├─ #{cli_subscriber("GenerateAvatar")}
589+
| └─ #{cli_event("UserEvent")}
590+
│ ├─ #{cli_subscriber("UpdateUsersCache")}
591+
| └─ #{cli_event("InstrumentedEvent")}
592+
| └─ #{cli_event("TrackableEvent")}
593+
│ └─ #{cli_subscriber("TrackPublishedAt")}
594+
| └─ #{cli_event("Event")}
595+
│ └─ #{cli_subscriber("LogEvent")}
596+
CLI
597+
end
598+
599+
it "correctly outputs subscribers tree" do
600+
expect { subject }.to output(expected).to_stdout
601+
end
602+
end
603+
end
296604
end

0 commit comments

Comments
 (0)