Skip to content

Commit

Permalink
Feature/message find by (#12)
Browse files Browse the repository at this point in the history
  • Loading branch information
bedrock-adam authored Mar 16, 2024
1 parent ac44084 commit 9f54d8d
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 10 deletions.
6 changes: 3 additions & 3 deletions db/seeds.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@
message_text: 'Validation failed: Exceptions is invalid')

failed_message_exception.frames.create!(
index: 0,
index: 1,
text: "/lib/active_record/validations.rb:84:in `raise_validation_error'")

failed_message_exception.frames.create!(
index: 1,
index: 2,
text: "/lib/active_record/validations.rb:55:in `save!'")

failed_message_exception.frames.create!(
index: 2,
index: 3,
text: "lib/active_record/transactions.rb:313:in `block in save!'")
end
end
29 changes: 29 additions & 0 deletions lib/outboxer/message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,35 @@ class Error < Outboxer::Error; end;
class NotFound < Error; end
class InvalidTransition < Error; end

def find_by_id!(id:)
message = Models::Message.includes(exceptions: :frames).find_by!(id: id)

{
'id' => message.id,
'status' => message.status,
'messageable' => "#{message.messageable_type}::#{message.messageable_id}",
'created_at' => message.created_at.utc.to_s,
'updated_at' => message.updated_at.utc.to_s,
'exceptions' => message.exceptions.map do |exception|
{
'id' => exception.id,
'class_name' => exception.class_name,
'message_text' => exception.message_text,
'created_at' => exception.created_at.utc.to_s,
'frames' => exception.frames.map do |frame|
{
'id' => frame.id,
'index' => frame.index,
'text' => frame.text
}
end
}
end
}
rescue ActiveRecord::RecordNotFound
raise NotFound, "Couldn't find Outboxer::Models::Message with id #{id}"
end

def published!(id:)
ActiveRecord::Base.connection_pool.with_connection do
outboxer_message = Models::Message.order(created_at: :asc).lock.find_by!(id: id)
Expand Down
7 changes: 7 additions & 0 deletions spec/factories/outboxer_exceptions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FactoryBot.define do
factory :outboxer_exception, class: 'Outboxer::Models::Exception' do
class_name { 'NoMethodError' }
message_text { 'undefined method `method_name' }
created_at { DateTime.parse("2024-03-16T12:00:00") }
end
end
6 changes: 6 additions & 0 deletions spec/factories/outboxer_frames.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FactoryBot.define do
factory :outboxer_frame, class: 'Outboxer::Models::Frame' do
index { 1 }
text { 'app/controllers/my_controller.rb:23:in `index`' }
end
end
10 changes: 5 additions & 5 deletions spec/factories/outboxer_messages.rb
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
FactoryBot.define do
factory :outboxer_message, class: 'Outboxer::Models::Message' do
messageable_type { 'DummyType' }
messageable_type { 'Event' }
messageable_id { 1 }
status { Outboxer::Models::Message::Status::PUBLISHING }
created_at { 1.day.ago }

trait :publishing do
status { Outboxer::Models::Message::Status::PUBLISHING }
end

trait :unpublished do
status { Outboxer::Models::Message::Status::UNPUBLISHED }
end

trait :publishing do
status { Outboxer::Models::Message::Status::PUBLISHING }
end

trait :failed do
status { Outboxer::Models::Message::Status::FAILED }
end
Expand Down
34 changes: 34 additions & 0 deletions spec/lib/outboxer/message/find_by_id_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
require 'spec_helper'

module Outboxer
RSpec.describe Message do
describe '.find_by_id!' do
context 'when a failed message exists' do
let!(:message) { create(:outboxer_message, :failed) }
let!(:exception) { create(:outboxer_exception, message: message) }
let!(:frame) { create(:outboxer_frame, exception: exception) }

it 'returns the message, exceptions and frames' do
result = Message.find_by_id!(id: message.id)

expect(result['id']).to eq(message.id)
expect(result['status']).to eq('failed')
expect(result['created_at']).to eq(message.created_at.utc.to_s)
expect(result['updated_at']).to eq(message.updated_at.utc.to_s)
expect(result['exceptions'].first['id']).to eq(exception.id)
expect(result['exceptions'].first['class_name']).to eq(exception.class_name)
expect(result['exceptions'].first['message_text']).to eq(exception.message_text)
expect(result['exceptions'].first['frames'].first['id']).to eq(frame.id)
expect(result['exceptions'].first['frames'].first['index']).to eq(frame.index)
expect(result['exceptions'].first['frames'].first['text']).to eq(frame.text)
end
end

context 'when the message does not exist' do
it 'raises a NotFound error' do
expect { Message.find_by_id!(id: -1) }.to raise_error(Message::NotFound)
end
end
end
end
end
2 changes: 1 addition & 1 deletion spec/lib/outboxer/publisher/pop_message_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ module Outboxer

it 'processes the message' do
Publisher.pop_message!(queue: queue, logger: logger) do |msg|
expect(msg.messageable_type).to eq('DummyType')
expect(msg.messageable_type).to eq('Event')
expect(msg.id).to eq(message.id)
end
end
Expand Down
2 changes: 1 addition & 1 deletion spec/lib/outboxer/publisher/publish_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ module Outboxer
logger: logger,
kernel: kernel
) do |publishing_message|
expect(publishing_message.messageable_type).to eq('DummyType')
expect(publishing_message.messageable_type).to eq('Event')
expect(publishing_message.messageable_id).to eq('1')
expect(publishing_message.status).to eq(Models::Message::Status::PUBLISHING)

Expand Down

0 comments on commit 9f54d8d

Please sign in to comment.