|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +require 'rails_helper' |
| 4 | + |
| 5 | +RSpec.describe RubyLLM::ActiveRecord::ActsAs do |
| 6 | + include_context 'with configured RubyLLM' |
| 7 | + |
| 8 | + let(:chat) { Chat.create! } |
| 9 | + |
| 10 | + def mock_action_text(plain_text) |
| 11 | + instance_double(ActionText::RichText).tap do |mock| |
| 12 | + allow(mock).to receive(:to_plain_text).and_return(plain_text) |
| 13 | + end |
| 14 | + end |
| 15 | + |
| 16 | + def create_message_with_action_text(content_text) |
| 17 | + message = chat.messages.create!(role: :user) |
| 18 | + action_text_content = mock_action_text(content_text) |
| 19 | + allow(message).to receive(:content).and_return(action_text_content) |
| 20 | + [message, action_text_content] |
| 21 | + end |
| 22 | + |
| 23 | + describe 'Action Text content extraction' do |
| 24 | + context 'when content responds to to_plain_text' do |
| 25 | + it 'extracts plain text from Action Text content' do |
| 26 | + message, action_text_content = create_message_with_action_text('This is plain text') |
| 27 | + |
| 28 | + llm_message = message.to_llm |
| 29 | + |
| 30 | + expect(action_text_content).to have_received(:to_plain_text) |
| 31 | + expect(llm_message.content).to eq('This is plain text') |
| 32 | + end |
| 33 | + end |
| 34 | + |
| 35 | + context 'when content is a regular string' do |
| 36 | + it 'returns content unchanged' do |
| 37 | + message = chat.messages.create!(role: :user, content: 'Regular text content') |
| 38 | + |
| 39 | + expect(message.to_llm.content).to eq('Regular text content') |
| 40 | + end |
| 41 | + end |
| 42 | + |
| 43 | + context 'when Action Text content has attachments' do |
| 44 | + let(:test_attachment) do |
| 45 | + { io: StringIO.new('test data'), filename: 'test.txt', content_type: 'text/plain' } |
| 46 | + end |
| 47 | + |
| 48 | + it 'combines Action Text with attachments into RubyLLM::Content' do |
| 49 | + message, action_text_content = create_message_with_action_text('Rich text with attachment') |
| 50 | + message.attachments.attach(test_attachment) |
| 51 | + |
| 52 | + llm_message = message.to_llm |
| 53 | + |
| 54 | + expect(action_text_content).to have_received(:to_plain_text) |
| 55 | + expect(llm_message.content).to be_a(RubyLLM::Content) |
| 56 | + expect(llm_message.content.text).to eq('Rich text with attachment') |
| 57 | + expect(llm_message.content.attachments.first.mime_type).to eq('text/plain') |
| 58 | + end |
| 59 | + end |
| 60 | + end |
| 61 | +end |
0 commit comments